获取二叉树的大小和高度

Getting size and height of binary tree

本文关键字:高度 二叉树 获取      更新时间:2023-10-16

目前,我正在尝试找到二叉树的高度和大小,但是我遇到了一些问题。我的代码目前无法编译,我无法找出我一生做错了什么。

template <class T>
int getHeight() const {
    int height = 0;
    Node * heightNode = new Node();
    heightNode = _root;
    height = max(right->height(), left->height()) + 1;
    return height;
}

我的思维过程是不断遍历左右子树,并为我们减少的树的每一层添加 1。但是,我得到的错误是:

  1. "->高度"的左侧必须指向类/结构/联合/泛型类型
  2. '_Ty std::max(std::initializer_list<_Elem>,_Pr)' : 期望 2 个参数 - 提供 1 个参数等。

我已经尝试了一些类似这样的事情 ->right.height() 等。

接下来,大小函数

int getSize() const {
    int size;
    inorderTraverse(cout, this->Node->left); //L 
    size++;                               //V
    inorderTraverse(cout, this->Node->right);//R
    return size;
}

我的想法是使用我已经编写和测试过的无序遍历来尝试遍历每个节点,而不是打印顶点,而是为每个顶点添加 1 的大小。

我的 getSize 操作也遇到了同样的错误。显然,我的C++代码一定存在一些根本性的缺陷,但我自己无法弄清楚。任何帮助将不胜感激。

class BST{
private:
    class Node {
    public:
        T data;
        Node * left;
        Node * right;
        Node * parent;
    };
    private:
    Node * root;
    ...
}

首先,这里最好摆脱手动内存管理,对左右子节点使用std::unique_ptr。这些应正确初始化为 nullptr 。非拥有父节点指针可以保留为原始指针,但请注意不要delete其内容。

class BST
{
private:
    class Node
    {
    public:
        T data;
        Node* parent;
        std::unique_ptr<Node> left;
        std::unique_ptr<Node> right;
    };
    private:
    std::unique_ptr<Node> root;
};

然后,类 Node 中的递归高度定义可能如下所示:

int height()
{
    //I'm assuming both nodes are either set or unset
    if(left == nullptr && right == nullptr) 
    {
        return 0;
    }
    else
    {
        return std::max(left->height(), right->height()) + 1;
    }
}

上面的函数为根节点(如果它是唯一可用的节点)提供零深度。正如所写,我假设两个节点都已设置或未设置,即不会发生仅设置左节点或仅设置右节点的情况(严格来说,可以省略两个子节点的nullptr检查)。如果这不成立,可以轻松调整代码。

此外,您还可以通过使用转换为布尔值属性来缩写检查unique_ptr

if(left && right) 
{
    //...
}

看起来更好一点,