求二叉樹高度的幾種方法!!!!!!!
阿新 • • 發佈:2018-12-23
如題,我搜了搜求二叉樹,搜到好多方法,我挑一下我覺得幾個簡單的遞迴求高度的方法。
得先說一下我建樹的習慣: 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
我醒來時,陽光在草地上飛揚。