我一直在寻找如何计算二进制搜索树的高度,我的研究引导我进行以下实现。我仍然试图解决为什么它应该工作,但我也不确定它为什么不起作用。这是我的身高函数。
int BinaryTreeNode::height() const {
int lefth = left->height();
int righth = right->height();
if(lefth > righth) {
return lefth + 1;
} else {
return righth + 1;
}
}
这是我的节点
的类定义class BinaryTreeNode {
public:
Data * nodeData;
BinaryTreeNode * left;
BinaryTreeNode * right;
当我尝试运行它时,我的程序会锁定并崩溃。我错过了一些明显的东西吗?
编辑:为什么不能这样做?
int BinaryTreeNode::height() const {
int l = 0;
if (left != NULL) {
left->height();
}
int r = 0;
if (right != NULL) {
right->height();
}
if (l > r) {
return l + 1;
}
else {
return r + 1;
}
}
答案 0 :(得分:10)
你的树不是无限的。所以,我想一些节点没有左或右子节点,在这种情况下指针left
和/或right
为空。在尝试使用它们之前,你必须检查它们的存在。
尝试使用该功能:
int BinaryTreeNode::height()
{
int l = left ? left->height() : 0; // height of left child, if any
int r = right ? right->height() : 0; // idem for right child
return 1 + max(l, r);
}
注意:我已经简化了你的身高计算。
答案 1 :(得分:2)
问题是你的函数永远不会检查子指针是否为NULL
,所以除了解除引用无效指针之外,你还有一个错过基本情况的递归函数:
试试这个版本:
int BinaryTreeNode::height() const
{
int lefth = 0;
if (left != NULL) { lefth = left->height(); }
int righth = 0;
if (righth != NULL) { righth = right->height(); }
if (lefth > righth) { return lefth + 1; }
else { return righth + 1; }
}
答案 2 :(得分:0)
即使我遇到了同样的问题,你的代码的问题在于,在你的函数中你使用了两次递归而且你要去左右两端,但是你没有检查一个正确的孩子的可能性左子树中的父节点有自己的子节点,因此您不会遍历树中的最后一个叶节点!希望这有帮助