二叉樹平衡檢查

2021-09-02 14:26:13 字數 2655 閱讀 8619

實現乙個函式,檢查二叉樹是否平衡,平衡的定義如下,對於樹中任意乙個結點,兩顆子樹的高度差不超過1。給定指向樹根結點的指標treenode* root,請返回乙個bool,代表這棵樹是否平衡。

樹結構自身就是遞迴定義,很多問題都可以利用遞迴巧妙地實現,對於這道題,關鍵點有兩處:

求結點左右子樹高度差

遍歷樹中所有結點

之前我們做過樹的最大深度問題以及樹的遍歷問題,將兩者結合起來,便可以解決這兩個關鍵點。

解題思路為:

若根結點為空,則二叉樹平衡

呼叫depth函式求結點高度

分別求出結點左右子樹高度並將高度差賦給differ,判斷是否滿足平衡二叉樹的條件

遞迴遍歷左子樹和右子樹,重複以上操作

/*struct treenode

};

*/

class balance

//計算結點高度

int depth(treenode *root)

};

這道題中值得一提的是其中體現出的遞迴思想源**中有兩處遞迴呼叫,而如果我們去觀察的話,會發現它們的形式是不同的。isbalance函式中,問題的解決遞迴呼叫函式之前,而在depth函式中,遞迴呼叫函式問題的解決之前。但是,這又有什麼不同呢?

我們知道遞迴是乙個呼叫並返回的過程,它要求待解決的問題可以拆分為很多個解法相同或類似的小問題,通過的過程由近及遠,到達臨界點(也就是結束條件)然後再開始,我們經常搞不清楚的是在這樣乙個過程中,問題是如何一步步被解決的?

之前看了一篇關於大腦理解遞迴的文章,裡面對於這一點講得很好,對於我理解遞迴起到了很大的幫助。

遞迴過程有不同的模式,而它們都有三個共同的要素:遞+結束條件+歸

function(大問題)else

}

這種模式就對應於源**中的depth函式,假如我們給定一棵如下結構的二叉樹,

我們去分析depth函式的遞迴流程,如下:

從圖中可以看出,程式的執行流程是遞迴呼叫函式(遞)→返回(結束條件)→解決問題(歸),問題是在遞迴呼叫返回的過程中一步步被解決的。

function(大問題)else

}

這種模式就對應於源**中的isbalance函式,依舊利用上面提及的二叉樹結構,去分析isbalance函式的遞迴流程,如下:

從圖中可以看出,程式的執行流程是解決問題(遞)→遞迴呼叫函式(遞)→返回(結束條件)→一步步返回上層(歸),每一次問題的解決都是在遞迴呼叫函式的過程中()便已經被解決,而不是在返回()的過程中。

對於遞迴思想的理解,有人曾做了乙個形象的比喻:

你開啟面前這扇門,看到屋裡面還有一扇門(這門可能跟前面開啟的門一樣大小(靜),也可能門小了些(動)),你走過去,發現手中的鑰匙還可以開啟它,你推開門,發現裡面還有一扇門,你繼續開啟,。。。, 若干次之後,你開啟面前一扇門,發現只有一間屋子,沒有門了。 你開始原路返回,每走回一間屋子,你數一次,走到入口的時候,你可以回答出你到底用這鑰匙開了幾扇門。

這種說法其實並不全面,它對應了模式1,在的過程中一步步解決問題。

或許我們可以對其稍加修改,以對應模式2

你開啟面前這扇門,看到屋裡面還有一扇門(這門可能跟前面開啟的門一樣大小(靜),也可能門小了些(動)),你走過去,發現手中的鑰匙還可以開啟它,你推開門,發現裡面還有一扇門,你繼續開啟。。。而在開啟門的過程中,每走到一間屋子,你數一次, 若干次之後,你開啟面前一扇門,發現只有一間屋子,沒有門了。 你開始原路返回,走到入口的時候,你可以回答出你到底用這鑰匙開了幾扇門。

這兩種形式都有呼叫並返回(遞迴)的過程,不同點在於問題被解決的時機不同,有可能是在的過程中就已經被解決,也可能是在的過程中被解決。

二叉樹平衡檢查

題目描述 實現乙個函式,檢查二叉樹是否平衡,平衡的定義如下,對於樹中的任意乙個結點,其兩顆子樹的高度差不超過1。給定指向樹根結點的指標treenode root,請返回乙個bool,代表這棵樹是否平衡。思路一 用遞迴來遍歷計算每個節點左右子樹的高度,最後比較差值。時間複雜度o n logn publ...

二叉樹平衡檢查

題目描述 實現乙個函式,檢查二叉樹是否平衡,平衡的定義如下,對於樹中的任意乙個結點,其兩顆子樹的高度差不超過1。給定指向樹根結點的指標treenode root,請返回乙個bool,代表這棵樹是否平衡。coding utf 8 class treenode def init self,x self....

C 二叉樹平衡檢查

關於二叉樹與圖 1.從無到有實現二叉樹和圖 2.在二叉樹和圖中檢索 查詢target value 二叉搜尋樹 binary search tree 所要滿足的條件 對於二叉搜尋樹中任意乙個節點 它的左子樹中的所有數值都比當前節點的關鍵碼小 它的右子樹中的所有節點的關鍵碼都比當前節點的關鍵碼大 二叉搜...