二叉搜索树中的高度函数
Height function in Binary Search Tree
以下是我用于在BST中查找高度的代码。虽然它运行良好,但我通过反复试验编写了这段代码。任何人都可以逐步解释它是如何工作的吗?代码的试运行示例将不胜感激。
int Tree::height(tree * Height)
{
if(Height->left==NULL && Height->right==NULL)
{
return 0;
}
else
{
l=height(Height->left);
r=height(Height->right);
if (l>r)
{
l=l+1;
return l;
}
else
{
r=r+1;
return r;
}
}
}
我建议您根据其含义将参数的名称更改为"node",并带有小写字母。
然后,此代码立即检查根是否有子项,如果没有,则返回 0。
然后递归地从左到右访问树的所有节点,这是正确的。当它到达叶子时,返回的值为 0,对于 l 和 r,因此 r 值递增,执行继续。当递归结束时,你有树的左右高度减去 1(叶子之前数为 0),所以加上 1,你就有了整个高度。
请注意,此方法返回树的高度,但您无法知道哪个叶子最深,因为当 l 和 r 中同时返回 0 时,您总是递增 r。
你的getHeight()-function是这个的变体
int getHeight(tree *p)
{
if (!p)
return 0;
int left = getHeight(p->left);
int right = getHeight(p->right);
return max(left, right) +1;
}
需要注意的最重要的事情是它使用递归,这意味着函数调用自身(getHeight()在getHeight()本身内部调用)在你的代码中,getHeight() 被命名为 height()
树的高度相当于递归的深度
函数 getHeight() 在达到二叉搜索树的最低级别时被递归调用。递归深度是递归调用 getHeight() 的数字(因子)。每次调用getHeight()要么将计数器增加一个,因此最终计数器的值是二叉搜索树的高度,或者在BST的最低级别,"级别跳跃"的次数由max(left, right) +1;
确定。这是getHeight()确定二叉搜索树高度的过程。
请参阅维基百科关于递归 https://en.wikipedia.org/wiki/Recursion_(computer_science)的文章
当指针引用结构的成员时,使用箭头运算符 ->(在这种情况下,结构 'p' 是树或其当前的短点 'left' 和 'right' 是传出分支)
要理解的关键点是递归的工作原理。在物理和数学中,递归类似于自映射或自引用
在函数式编程/Lambda演算(https://en.wikipedia.org/wiki/Functional_programming)中,递归是唯一使用的编程技术。它是命令式编程的对应物。
Alan Turing证明了每个可以用命令式编程编写的程序也可以用函数式编程/lambda演算(使用递归)编写
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 计算树高度的函数
- 使用递归计算一个函数中的高度和大小
- 一个递归函数,用于计算 n-airy 树的高度
- 二叉搜索树中的高度函数
- 我应该在高度动态的系统中使用优先级队列来调度任务(函数等)吗
- 如何引用的形式和改变属性(高度和宽度)从一个函数在Qt