获取二叉树的大小和高度

时间:2014-11-17 08:10:06

标签: c++ data-structures

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

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. 左边的&#39; - &gt;身高&#39;必须指向class / struct / union / generic type
  2. &#39; _Ty std :: max(std :: initializer_list&lt; _Elem&gt;,_ Pr)&#39; :期望2个参数 - 提供1个 等。
  3. 我尝试了一些像这样的事情 - &gt; right.height()等。

    接下来,大小函数

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

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

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

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

1 个答案:

答案 0 :(得分:0)

首先,最好摆脱手动内存管理,并对左右子节点使用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

的conversion-to-bool属性来缩写检查
if(left && right) 
{
    //...
}

看起来好一点,