求二叉树高度的几种方法!!!!!!!

如题,我搜了搜求二叉树,搜到好多方法,我挑一下我觉得几个简单的递归求高度的方法。

得先说一下我建树的习惯:
struct tree
{
    char data;
    tree *lboy;              男左女右,所以我就是左孩子leftboy,右孩子rightgirl。
    tree *rgirl;
};

第一种:
int h1(tree *root)
{
    if(!root) return 0;
    else
    {
        int m = h1(root->lboy);
        int n = h1(root->rgirl);
        return(m > n) ? (m + 1) :(n + 1);
    }
}
关于这个+1是干啥的。首先我再提醒一下这是递“归”的思想。
意思如果根有孩子,当孩子”归“的时候带回来个1。 自身再比较一
下左孩子带过来的1多还是右孩子带过来的1多。如果没孩子的话,
他孩子带回来的就是0,但是他本身算一层,所以+1;

这一种我看到一个评论里发了个更简化的,真是短!!小精悍!!!
int h1(tree* root)
{
    if( !root )  return 0;
    return  max(h1(root->lboy), h1(root->rgirl)) + 1; 
}                
    反正我是被感动了,两行结束。


第二种:
int max1 = 0;
int h2(tree *root, int depth)
{
    if(root)
    {      /////下边两个if就是表示如果还有左右孩子的话,深度就加一,让孩子继续向下延伸;
    if(root->lboy)                 
        h2(root->lboy, depth+1);
    if(root->rgirl)
        h2(root->rgirl, depth+1);
    }               
   if(depth > max1) max1 = depth;   
           //////// 因为不知道那个孩子延伸的最深,所以就判断一下最深是多少。
   return max1;        返回最深的值就行。
}
对于这个初始是输入depth = 1就行:也就是  h2(root, 1);

更新!!!!!!
写到平衡二叉树,发现新的求高度的方法,我给一下新的方法。
上边的两种方法有个缺点,每次求一个点的高度都得从新递归求,如果我们建立二叉树的时候就把每个结点的高度求出来,然后再插入新的结点时,我们就可以调用原来那些已经求过的结点的高度了,不用从新递归求过来一遍了!!!
关于树的高度,深度,结点的高度深度,不同的树有不同的定义,推荐个分析:
https://blog.csdn.net/qq_36667170/article/details/84142019

struct tree
{
    int data;
    tree *lboy;
    tree *rgirl;
    int high;                high的缩写
};

int hi(tree *root)
{
    if ( !root ) return 0;
    return root->high; 
}
创建二叉树时在return root前加一句东西,也就是下面的:
root->high = max( hi(root->lboy), hi(root->rgirl) ) + 1;
return 0;

除此之外,我搜到的有个总结:
算法一:采用后序遍历二叉树,结点最大栈长即为二叉树的高度;
算法二:层次遍历二叉树,最大层次即为二叉树的高度;
算法三:采用递归算法,求二叉树的高度。
我还是喜欢代码少的233,如果对那两个感兴趣,可以去看一下
https://blog.csdn.net/NCC__dapeng/article/details/83817302

                             我醒来时,阳光在草地上飞扬。

猜你喜欢

转载自blog.csdn.net/weixin_43822064/article/details/85163095