二叉搜索树中的高度函数

Height function in Binary Search Tree

本文关键字:高度 函数 搜索树      更新时间:2023-10-16

以下是我用于在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演算(使用递归)编写