目前,我正试图找到二叉树的高度和大小,但是我遇到了一些问题。我的代码目前无法编译,我无法找到我在生活中做错的事情。
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。但是,我得到的错误是:
我尝试了一些像这样的事情 - &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;
...
}
答案 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
if(left && right)
{
//...
}
看起来好一点,