1. 程式人生 > >求二叉樹高度的幾種方法!!!!!!!

求二叉樹高度的幾種方法!!!!!!!

如題,我搜了搜求二叉樹,搜到好多方法,我挑一下我覺得幾個簡單的遞迴求高度的方法。

得先說一下我建樹的習慣:
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

                             我醒來時,陽光在草地上飛揚。