39. 是否為平衡二叉樹
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹任意結點的左右子樹高度差不大於1就是平衡二叉樹。
1 class solution
8 // 前序遞迴遍歷
9 int preorder(treenode* proot)
17 return 0;
18 }
19
20 };
leetcode執行時間為1ms, 空間為38.8mb
時間複雜度:一定會遍歷樹的所有結點,即使很早就發現了該樹是不平衡樹,所以時間複雜度為o(n)
空間複雜度:遞迴深度為樹的最大高度,高度平均為o(logn), 最壞為o(n),所以空間複雜度也是平均為o(logn), 最壞為o(n)
結題思路大致和上面一樣,只不過這裡沒有借助乙個標記flag, 直接通過返回樹高-1來表示樹不平衡。而且統計樹高的函式進行了剪枝,只要左子樹不平衡或者右子樹不平衡直接返回整棵樹不平衡,減少後續無效計算。
1 class solution
6 7 // 統計樹高的輔助函式
8 public int treeheight(treenode root)else
17 int rightheight = treeheight(root.right);
18 if(rightheight == -1)
21 return math.abs(leftheight - rightheight) > 1 ? -1 : math.max(leftheight, rightheight) + 1;
22 }
23 }
24 }
leetcode執行時間為1ms, 空間為39.1mb
時間複雜度:最壞情況下會遍歷整棵樹的所有結點,複雜度為o(n), 但是演算法經過了剪枝處理,複雜度應該會比思路一好一些。
空間複雜度:樹的高度就是棧的深度,高度平均為o(logn), 最壞為o(n),所以空間複雜度也是平均為o(logn), 最壞為o(n)
思路參考:
遞迴判斷左右子樹是否平衡,統計左右子樹高度差。這個方法會有很多重複計算
1 class solution
7 // 遞迴判斷左右子樹是否平衡,統計左右子樹高度差
8 return isbalanced(root.left) && isbalanced(root.right) && math.abs(treeheight(root.left) - treeheight(root.right)) < 2;
9 }
10 11 // 統計樹高的輔助函式
12 public int treeheight(treenode root)
16 return math.max(treeheight(root.left), treeheight(root.right)) + 1;
17 }
18 }
leetcode執行時間為1ms, 空間為39.4mb
劍指offer 39 判斷二叉樹是否為平衡二叉樹
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。思路 如果直接使用遞迴遍歷,會重複遍歷之前的節點,更好的方法是採用後序遍歷,對每個節點來說,我們都已經遍歷了它的左右子樹,所以邊遍歷邊判斷,最後遍歷到樹的根節點時,判斷完畢。遞迴遍歷 class solution 後序遍歷 class solution ...
劍指offer 39 平衡二叉樹
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。首先,什麼是平衡二叉樹?如果二叉樹中任意結點的左右子樹深度相差不超過1,那麼它就是平衡二叉樹。最直接的做法,遍歷每個結點,借助乙個獲取樹深度的遞迴函式,根據該結點的左右子樹高度差判斷是否平衡,然後遞迴地對左右子樹進行判斷。public class sol...
劍指offer39 平衡二叉樹
題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。首先要搞清楚什麼是平衡二叉樹 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。很直觀用遞迴來解決 coding utf 8 class treenode def init self,x self.va...