劍指offer 判斷乙個樹是否時平衡二叉樹

2021-08-16 09:52:29 字數 2280 閱讀 2100

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。

思路:1.最直接的做法,遍歷每個結點,借助乙個獲取樹深度的遞迴函式,根據該結點的左右子樹高度差判斷是否平衡,然後遞迴地對左右子樹進行判斷。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

publicclasssolution

returnmath.abs(maxdepth(root.left) - maxdepth(root.right)) <=1&&

isbalanced_solution(root.left) && isbalanced_solution(root.right);

}

privateintmaxdepth(treenode root)

return1+ math.max(maxdepth(root.left), maxdepth(root.right));

}

}

這種做法有很明顯的問題,在判斷上層結點的時候,會多次重複遍歷下層結點,增加了不必要的開銷。如果改為從下往上遍歷,如果子樹是平衡二叉樹,則返回子樹的高度;如果發現子樹不是平衡二叉樹,則直接停止遍歷,這樣至多只對每個結點訪問一次。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

publicclasssolution

privateintgetdepth(treenode root)

intleftheight = getdepth(root.left);

if(leftheight == -1)

intrightheight = getdepth(root.right);

if(rightheight == -1)

returnmath.abs(leftheight - rightheight) >1? -1:1+ math.max(leftheight, rightheight);

}

}

2。//後續遍歷時,遍歷到乙個節點,其左右子樹已經遍歷  依次自底向上判斷,每個節點只需要遍歷一次

劍指Offer之判斷乙個數是否是回文數

整體思路就是取數字中最高位和最低位來比較,然後再分別向下取數迴圈此操作,如果其中有乙個不相等,返回false 否則返回true,下面以乙個數字來具體說明 4 5 6 5 4 1.首先先取數字中的最高位,其他位都為0的數help,help是這樣算的 int help 1 while n hlep 10...

劍指offer 判斷乙個二維陣列是否有要查的數

題目 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。方法1 首先想到的方法 同時遍歷行數和列數,再判斷是否與整數相等,相等返回 true 否則返回 false 複雜度高些但容易想到...

劍指offer 判斷B樹是否是A樹的子結構

題目描述 輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 一道蠻有意思的題,一開始理解錯題意了,只考慮了b樹完全覆蓋了a中某棵子樹,並且以為一定存在根節點相同就完全匹配b樹的子樹。然後想著只要從a樹根節點往下遍歷直到找到乙個節點與b的根節點匹配即可。還是想的太...