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