輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
思路:1.最直接的做法,遍歷每個結點,借助乙個獲取樹深度的遞迴函式,根據該結點的左右子樹高度差判斷是否平衡,然後遞迴地對左右子樹進行判斷。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public
classsolution
return
math.abs(maxdepth(root.left) - maxdepth(root.right)) <=
1
&&
isbalanced_solution(root.left) && isbalanced_solution(root.right);
}
private
int
maxdepth(treenode root)
return
1
+ 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
public
class
solution
private
int
getdepth(treenode root)
int
leftheight = getdepth(root.left);
if
(leftheight == -
1
)
int
rightheight = getdepth(root.right);
if
(rightheight == -
1
)
return
math.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的根節點匹配即可。還是想的太...