平衡二叉树的构造_LeetCode-平衡二叉树
描述:給定一個二叉樹,判斷它是否是高度平衡的二叉樹。
本題高度平衡二叉樹定義:一個二叉樹每個節點的左右兩個子樹的高度差的絕對值不超過1。
示例1:
給定二叉樹[3,9,20,null,null,15,7],返回true
3
/
9 20
/
15 7
示例2:
給定二叉樹[1,2,2,3,3,null,null,4,4],返回false
1
/
2 2
/
3 3
/
4 4
從底至頂(提前終結法)
1、對二叉樹做深度優先遍歷DFS,遞歸過程中:
1.1、終止條件:當DFS越過葉子節點時,返回高度0;
1.2、返回值:
1.2.1、從底至頂,返回以每個節點root為根節點的子樹最大高度(左右子樹中最大的高度值加1max(left,right) + 1);
1.2.2、當我們發現有一例 左/右子樹高度差 > 1 的情況時,代表此樹不是平衡樹,返回-1;
1.3、當發現不是平衡樹時,后面的高度計算完全沒有意義,因此直接返回-1,避免后續過多的計算。
2、最差情況是對樹做一遍完整DFS,時間復雜度為O(N)。
public boolean isBalanced(TreeNode root) {
return depth(root) != -1;
}
private int depth(TreeNode root) {
if (root == null) return 0;
int left = depth(root.left);
if(left == -1) return -1;
int right = depth(root.right);
if(right == -1) return -1;
return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
}
從頂至底(暴力法)
1、構造一個獲取當前節點最大深度的方法 depth() ,通過比較左右子樹最大高度差abs(self.depth(root.left) - self.depth(root.right)),來判斷以此節點為根節點下是否是二叉平衡樹;
2、從頂至底DFS,以每個節點為根節點,遞歸判斷是否是平衡二叉樹:
2.1、若所有根節點都滿足平衡二叉樹性質,則返回 True ;
2.2、若其中任何一個節點作為根節點時,不滿足平衡二叉樹性質,則返回False。
3、本方法產生大量重復的節點訪問和計算,最差情況下時間復雜度 O(N^2)
public boolean isBalanced(TreeNode root) {
if (root == null) return true;
return Math.abs(depth(root.left) - depth(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
}
private int depth(TreeNode root) {
if (root == null) return 0;
return Math.max(depth(root.left), depth(root.right)) + 1;
}
兩者思想上都類似,可能大家對于樹類型相關的題一直都很頭大,每次都是一看答案都會,自己動手持續懵逼,所以更要注重平時練習和學習,痛苦一段時間,理解之后就會發現還蠻有意思的。
辛苦各位大佬看完,不勝感激,有興趣的可以關注公眾號,內容持續更新發力,收獲滿滿,也可以微信私信,共同學習。
總結
以上是生活随笔為你收集整理的平衡二叉树的构造_LeetCode-平衡二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在微型计算机中1gb等于多少字节,1GB
- 下一篇: 固定底部 布局_Google Flutt