劍指offer 39 是否為平衡二叉樹

2021-10-19 07:25:05 字數 1714 閱讀 4995

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...