LeetCode 力扣 110 平衡二叉樹

2021-10-22 23:50:20 字數 3462 閱讀 2004

判斷一棵樹是否是平衡二叉樹,平衡二叉樹定義如下:

它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過 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的時候,我們需要提前返回-1rightdepth也會有同樣的問題,所以也需要提前返回-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...