判斷一棵樹是否是平衡二叉樹,平衡二叉樹定義如下:
它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過 1,並且左右兩個子樹都是一棵平衡二叉樹。直接按照定義來吧,並且多定義乙個求高度的函式,之前在 104 題 做過。
public
boolean
isbalanced
(treenode root)
//它的左右兩個子樹的高度差的絕對值不超過1
int leftdepth =
gettreedepth
(root.left)
;int rightdepth =
gettreedepth
(root.right);if
(math.
abs(leftdepth - rightdepth)
>1)
//左右兩個子樹都是一棵平衡二叉樹
return
isbalanced
(root.left)
&&isbalanced
(root.right);}
private
intgettreedepth
(treenode root)
int leftdepth =
gettreedepth
(root.left)
;int rightdepth =
gettreedepth
(root.right)
;return math.
max(leftdepth, rightdepth)+1
;}
大家覺不覺得解法一怪怪的,有一種少了些什麼的感覺,自己寫之前就有這種感覺,寫完以後仔細分析了一下。
當我們求左子樹的高度時,同樣是利用了遞迴去求它的左子樹的高度和右子樹的高度。
當**執行到
isbalanced
(root.left)
&&isbalanced
(root.right)
遞迴的判斷左子樹和右子樹是否是平衡二叉樹的時候,我們又會繼續求高度,求高度再次進入gettreedepth
函式的時候,我們會發現,其實在上一次這些高度都已經求過了。
第二個不好的地方在於,gettreedepth
遞迴的求高度的時候,也是求了左子樹的高度,右子樹的高度,此時完全可以判斷當前樹是否是平衡二叉樹了,而不是再繼續求高度。
綜上,我們其實只需要求一次高度,並且在求左子樹和右子樹的高度的同時,判斷一下當前是否是平衡二叉樹。
考慮到gettreedepth
函式返回的是int
值,同時高度不可能為負數,那麼如果求高度過程中我們發現了當前不是平衡二叉樹,就返回-1
。
private
intgettreedepth
(treenode root)
int leftdepth =
gettreedepth
(root.left)
;int rightdepth =
gettreedepth
(root.right);if
(math.
abs(leftdepth - rightdepth)
>1)
return math.
max(leftdepth, rightdepth)+1
;}
上邊的**還是有問題的,
int leftdepth =
gettreedepth
(root.left)
;int rightdepth =
gettreedepth
(root.right)
;
如果左右子樹都不是平衡二叉樹,此時都返回了-1
,那麼再執行下邊的**。
if
(math.
abs(leftdepth - rightdepth)
>1)
它們的差會是 0,不會進入if
中,但是本來應該進入if
返回-1
的。
所以當發現leftdepth
返回-1
的時候,我們需要提前返回-1
。rightdepth
也會有同樣的問題,所以也需要提前返回-1
。
private
intgettreedepth
(treenode root)
int leftdepth =
gettreedepth
(root.left);if
(leftdepth ==-1
)int rightdepth =
gettreedepth
(root.right);if
(rightdepth ==-1
)if(math.
abs(leftdepth - rightdepth)
>1)
return math.
max(leftdepth, rightdepth)+1
;}
對於我們要寫的isbalanced
函式,修改的話就簡單了,只需要呼叫一次gettreedepth
函式,然後判斷返回值是不是-1
就可以了。
public
boolean
isbalanced
(treenode root)
private
intgettreedepth
(treenode root)
int leftdepth =
gettreedepth
(root.left);if
(leftdepth ==-1
)int rightdepth =
gettreedepth
(root.right);if
(rightdepth ==-1
)if(math.
abs(leftdepth - rightdepth)
>1)
return math.
max(leftdepth, rightdepth)+1
;}
還是比較簡單的,有時候可能一下子想不到最優的思路,所以可以先把常規的想法先寫出來以便理清思路,然後嘗試著去優化。
更多詳細通俗題解詳見 leetcode.wang 。
力扣 簡單 110 平衡二叉樹
給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1 給定二叉樹 3,9,20,null,null,15,7 返回 true 示例 2 給定二叉樹 1,2,2,3,3,null,null,4,4 返回 f...
力扣題解 110 平衡二叉樹
給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回 true 示例 2 給定二叉樹 1,2,2,3,3,null,nu...
力扣解題思路 110 平衡二叉樹 糾錯記錄
思路 判斷一棵樹是否是平衡二叉樹。屬於簡單題,用dfs記錄每條路徑的長度,比較每個節點的左右子樹長度,只要不滿足就是false。但是做到一半我竟然卡住了 public boolean flag true public boolean isbalanced treenode root public i...