題目:輸入一棵二叉樹的根結點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過
1,那麼它就是一棵平衡二叉樹。例如下圖
中的二叉樹就是一棵平衡二叉樹:
在本系列部落格的第27題,我們曾介紹過如何求二叉樹的深度。有了求二叉樹的深度的經驗之後再解決這個問題,我們很容易就能想到乙個思路:在遍歷樹的每個結點的時候,呼叫函式
treedepth
得到它的左右子樹的深度。如果每個結點的左右子樹的深度相差都不超過
1,按照定義它就是一棵平衡的二叉樹。這種思路對應的**如下:
bool
isbalanced(binarytreenode* proot)
上面的**固然簡潔,但我們也要注意到由於乙個節點會被重複遍歷多次,這種思路的時間效率不高。例如在函式
isbalance
中輸入上圖
中的二叉樹,首先判斷根結點(值為
1的結點)的左右子樹是不是平衡結點。此時我們將往函式
treedepth
輸入左子樹根結點(值為
2的結點),需要遍歷結點4、
5、7。接下來判斷以值為
2的結點為根結點的子樹是不是平衡樹的時候,仍然會遍歷結點4、
5、7。毫無疑問,重複遍歷同乙個結點會影響效能。接下來我們尋找不需要重複遍歷的演算法。
如果我們用後序遍歷的方式遍歷二叉樹的每乙個結點,在遍歷到乙個結點之前我們已經遍歷了它的左右子樹。只要在遍歷每個結點的時候記錄它的深度(某一結點的深度等於它到葉節點的路徑的長度),我們就可以一邊遍歷一邊判斷每個結點是不是平衡的。下面是這種思路的參考**:
bool
isbalanced(binarytreenode* proot,int* pdepth)
intleft, right;
if(isbalanced(proot->m_pleft, &left)
&& isbalanced(proot->m_pright, &right))
} return
false; }
我們只需要給上面的函式傳入二叉樹的根結點以及乙個表示結點深度的整形變數就可以了:
bool
fun(binarytreenode* proot)
在上面的**中,我們用後序遍歷的方式遍歷整棵二叉樹。在遍歷某結點的左右子結點之後,我們可以根據它的左右子結點的深度判斷它是不是平衡的,並得到當前結點的深度。當最後遍歷到樹的根結點的時候,也就判斷了整棵二叉樹是不是平衡二叉樹了。
判斷二叉樹是不是平衡
題目 輸入一棵二叉樹的根結點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。例如下圖 中的二叉樹就是一棵平衡二叉樹 上面的 固然簡潔,但我們也要注意到由於乙個節點會被重複遍歷多次,這種思路的時間效率不高。例如在函式 isbalance 中輸入...
判斷是不是平衡二叉樹
問題 給出一棵二叉樹,判斷它是不是二叉樹。乙個比較容易想到的做法是,採用動態規則的方法依次求出每乙個節點的左子樹深度和右子樹深度,兩者相減,絕對值大於 1 則不是平衡樹。為了避免重複計算節點的深度,應該用後序遍歷的方法,即先計算子節點的深度,再計算當前節點的深度,這樣不會出現重複計算。如下 stru...
判斷二叉樹是不是平衡
題目 輸入一棵二叉樹的根結點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。例如下圖 中的二叉樹就是一棵平衡二叉樹 2上面的 固然簡潔,但我們也要注意到由於乙個節點會被重複遍歷多次,這種思路的時間效率不高。例如在函式 isbalance 中輸...