題目描述
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
該二叉樹不一定是二叉搜尋樹分析
每碰到乙個節點,就判斷以該結點為根的左右子樹是否是平衡二叉樹(通過求左右子樹的樹高),然後在判斷該結點的左右子樹為根的子樹是否是平衡二叉樹。這樣就遍歷樹中每乙個結點,對每個結點都判斷是否平衡二叉樹。
計算樹高**,最壞情況下單枝樹的時間複雜度o(n),空間o(n)
判斷是否平衡方法最壞o(n),故這種方法時間o(n
2)
o(n^2)
o(n2
),空間o(n
2)
o(n^2)
o(n2
)
class
solution
:def
isbalanced_solution
(self, root):if
not root:
return
true
hl = self.depth(root.left)
hr = self.depth(root.right)
is_balance =
abs(hl-hr)
<
2and self.isbalanced_solution(root.left)
and self.isbalanced_solution(root.right)
return is_balance
defdepth
(self, root):if
not root:
return
0return1+
max(self.depth(root.left)
, self.depth(root.right)
)s = solution(
).isbalanced_solution(root)
print
(s)
上面**從根節點開始每次都要重複遍歷子樹結點,所以時間複雜度高,下面從葉節點開始,依次往上求其子樹高度,如果在某一子樹上不滿足要求,則一路返回,不再繼續遍歷。時間最壞o(n),空間o(n)
class
solution
:def
isbalanced_solution
(self, root)
:return self.depth(root)!=-
1def
depth
(self, root):if
not root:
return
0 left = self.depth(root.left)
if left ==-1
:#若左子樹不滿足平衡,則整個樹已不是平衡二叉樹了,直接返回,不處理右子樹
return-1
right = self.depth(root.right)
if right ==-1
:#與上類似
return-1
return-1
ifabs
(left-right)
>
1else1+
max(left, right)
注意區分這兩種方法的不同,及其解決問題思想的差別。在避免樹結點的重複遍歷上的啟示。 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹
題目就是標題 public class main3 else public int balanced solution treenode root,int num 左節點 int left 0 if root.left null 這裡是為了判斷此節點左節點的下面是否滿足二叉樹左右深度不能超過1,下同...
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。思路1 遞迴 首先寫乙個返回樹的高度的函式 然後判斷左右子樹高度差 判斷左子樹的左右子樹高度差 判斷右子樹的左右子樹高度差 class solution inthigh treenode proot 思路2 自下而上判斷是否平衡 用遞迴雖然好,...
判斷一棵二叉樹是否為平衡二叉樹
1.先給出樹節點資訊 typedef struct treetree,bitree 2.原理 判斷一棵樹是否為平衡二叉樹,要滿足每個節點的左右子樹的高度之差的絕對值不大於1。因此,我們這裡可以比較每個節點的左右字數高度,判斷他們差的絕對值是否滿足平衡二叉樹的條件即可 3.演算法 求二叉樹高度演算法 ...