平衡二叉樹學習
一、概述
我不會說的很詳細,因爲我看到了兩篇很好的博客,已經說的很好了,如果要複習,就直接看他的博客,我只做提煉,幫助以後複習。
二、解釋本質
- 平衡二叉樹首先是一個二叉查找樹。
- 二叉查找樹是什麼呢?二叉查找樹就是根節點一定大於左子樹的所有值,一定小於右子樹的所有值,並且每個子樹都滿足該規律。
- 平衡二叉樹爲了解決什麼了,爲了解決如果出現鏈狀二叉樹,確定某個節點需要找O(n)次,這樣違背了查找二叉樹的初衷。如下圖,就是極端情況,右子樹是一個鏈:如果要找4,那麼就要走四次。
如果我們把它變成平衡二叉樹呢:那麼就是如下圖:(紅色是平衡因子),這樣優化後我們找4,就只要找2次
- 平衡二叉樹的平衡因子,就是根節點的左子樹深度減去右子樹深度,只能是-1,0,1 ;也就是如果左深度減去右深度的絕對值大於1,那就不平衡了
三、瞭解幾種旋轉
四、劍指offer第39題
判斷一個二叉樹是否是平衡二叉樹。
我的代碼:
public class Code039 {
boolean flag = true;
public boolean IsBalanced_Solution(TreeNode root) {
int count = 0;
count = judgeIsBalance(root,count);
return flag;
}
public int judgeIsBalance(TreeNode root, int count) {
if(root == null) {
return count;
}
count++;
int left = judgeIsBalance(root.left,count);
int right = judgeIsBalance(root.right, count);
if(Math.abs(left-right)>1) {
flag = false;
}
return Math.max(left, right); // 用來返回根節點下面 左子樹 和 右子樹中 哪個深度最大的
}
}