[二叉树] 判断一个二叉树是否是平衡(剑指offer39)
【試題描述】定義一個函數,輸入一個鏈表,判斷鏈表是否存在環路
平衡二叉樹,又稱AVL樹。它或者是一棵空樹,或者是具有下列性質的二叉樹:它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的高度之差之差的絕對值不超過1。
?
問題:判斷一個二叉排序樹是否是平衡二叉樹這里是二叉排序樹的定義解決方案:根據平衡二叉樹的定義,如果任意節點的左右子樹的深度相差不超過1,那這棵樹就是平衡二叉樹。首先編寫一個計算二叉樹深度的函數,利用遞歸實現。
?
解題思路有兩種,只遍歷一次的方法最優。
重復遍歷多次:
在遍歷樹的每個結點的時候,調用函數TreeDepth得到它的左右子樹的深度。如果每個結點的左右子樹的深度相差都不超過1,則這是一顆平衡的二叉樹。這種方法的缺點是,首先判斷根結點是不是平衡的,需要使用TreeDepth獲得左右子樹的深度,然后還需要繼續判斷子樹是不是平衡的,還是需要使用TreeDepth獲得子樹的左右子樹的深度,這樣就導致了大量的重復遍歷。
方法一:
class Solution:def IsBalanced_Solution(self, pRoot):return self.TreeDepth(pRoot) != -1def TreeDepth(self, pRoot):# write code hereif not pRoot:return 0left_depth = self.TreeDepth(pRoot.left)if left_depth == -1:return -1right_depth = self.TreeDepth(pRoot.right)if right_depth == -1:return -1if abs(left_depth-right_depth) > 1:return -1return max(1+left_depth, 1+right_depth)class Solution:def IsBalanced_Solution(self, pRoot):# write code hereif pRoot is None:return Truedef TreeDepth(root):if root == None:return 0return 1+max(TreeDepth(root.left), TreeDepth(root.right))if abs(TreeDepth(pRoot.left) - TreeDepth(pRoot.right)) > 1:return Falseelse:return True?
只遍歷一次:
重復遍歷會影響算法的性能,所以很有必要掌握不需要重復遍歷的方法。如果我們用后序遍歷的方式遍歷二叉樹的每一個結點,在遍歷到一個結點之前我們就已經遍歷了它的左右子樹。只要在遍歷每個結點的時候記錄它的深度(某一結點的深度等于它到葉結點的路徑的長度),我們就可以一邊遍歷一邊判斷每個結點是不是平衡的。
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution:def IsBalanced_Solution(self, pRoot):# write code here# 思路二:每個節點只遍歷一次的解法,后續遍歷每個節點depth = [0]# 想通過該遞歸函數判斷該樹是不是平衡二叉樹,同時還需要獲取左右子樹的深度,因此還需要傳入引用呢return self.IsBalanced(pRoot, depth) # 第二個參數要傳入引用def IsBalanced(self, pRoot, dep):if not pRoot: # 為None,表示空節點,深度為0,也算平衡二叉樹dep[0] = 0return Trueleft, right = [0], [0]if self.IsBalanced(pRoot.left, left) and self.IsBalanced(pRoot.right, right):if abs(left[0]-right[0]) <= 1:dep[0] = left[0]+1 if left[0] > right[0] else right[0] + 1return Truereturn False?
?
?
總結
以上是生活随笔為你收集整理的[二叉树] 判断一个二叉树是否是平衡(剑指offer39)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 本田CR-V氢燃料电池版2024年推出:
- 下一篇: 比亚迪元PLUS在海外攻城略地 但是全球