以下是我用于在BST中查找高度的代码。虽然它工作得很好,但我通过反复试验编写了这段代码。任何人都可以一步一步解释它是如何工作的吗?我们非常感谢代码的干运行示例。
!important
答案 0 :(得分:0)
我建议您将参数的名称更改为" node",相应地改为其含义以及小写字母。
然后,此代码会立即检查root是否有子节点,否则返回0。
然后递归地从左到右访问树的所有节点,这是正确的。当它到达叶子时,返回的值为0,对于l和r,因此 r 值递增,并继续执行。 当递归结束时,你有树的左右高度减去1(之前叶子数为0),所以增加了1并且你有整个高度。
请注意此方法返回树的高度,但您无法知道哪个叶子是最深的,因为当l和r都返回0时,总是递增r。
答案 1 :(得分:0)
你的getHeight() - 函数是这个
的变种C:\Files\Source\Repos\applications\core\App01>git svn branch branchName
Copying http://url/svn/company/applications/core/App01/trunk
at r7071 to http://url/svn/company/applications/core/App01/
branches/branchName...
Found possible branch point: http://url/svn/company/applications/core/App01/trunk => http://url/svn/company/applications/core/App01/branches/branchName, 7071
Found branch parent: (refs/remotes/origin/branchName) f8ba2fd450c30d4812b7549217eae1b2d5c7dd00
Following parent with do_switch
Successfully followed parent
r15037 = 52dd759833fd89c7be03f89093aba38090b3288f (refs/remotes/origin/branchName)
C:\Files\Source\Repos\applications\core\App01>
最重要的是它使用递归意味着函数调用自身(在getHeight()本身内部调用getHeight()) 在您的代码 getHeight()中命名为 height()
树的高度等于递归的深度
函数 getHeight()会在达到二进制搜索树的最低级别时递归调用。递归的深度是递归调用getHeight()的数量(因子)。每次调用 getHeight() 都会将计数器增加1,所以最后计数器的值是二进制搜索树的高度或在BST的最低级别,“级别跳跃”的数量由 int getHeight(tree *p)
{
if (!p)
return 0;
int left = getHeight(p->left);
int right = getHeight(p->right);
return max(left, right) +1;
}
确定。
这是 getHeight()确定二叉搜索树高度的过程。
请参阅维基百科关于递归的文章https://en.wikipedia.org/wiki/Recursion_(computer_science)
箭头操作符 - >当指针引用结构的成员时使用(在这种情况下,结构'p'是树或其当前的brach point 'left'和'正确'是传出的分支机构)
要理解的关键点是递归是如何工作的。在物理和数学中,递归类似于自映射或自我引用
在函数式编程/ Lambda演算(https://en.wikipedia.org/wiki/Functional_programming)中,递归是唯一使用的编程技术。它与命令式编程相对应。
Alan Turing证明了每个可以用命令式编程编写的程序也可以用函数式编程/ lambda演算(使用递归)编写