給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。
本題中,一棵高度平衡二叉樹定義為:
乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。
示例 1:
給定二叉樹 [3,9,20,null,null,15,7]
3/ \
9 20
/ \15 7
返回 true 。
示例 2:
給定二叉樹 [1,2,2,3,3,null,null,4,4]
1/ \
2 2/ \
3 3/ \
4 4返回 false 。
思路1:
遞迴解法。首先判斷是否空樹,然後判斷左右節點的深度差絕對值是否大於1,如果本層沒有問題,在判斷左右子樹是否是平衡二叉樹。**1:判斷深度時也使用遞迴。
# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class solution:
def depth(self,root):
if root==none:
return 0
left=self.depth(root.left)
right=self.depth(root.right)
return max(left,right)+1
def isbalanced(self, root):
""":type root: treenode
:rtype: bool
"""if root==none:
return true
if abs(self.depth(root.left)-self.depth(root.right))>1:
return false
else:
return self.isbalanced(root.left)& self.isbalanced(root.right)
分析1:
我對於二叉樹這塊的遞迴解法還是有一些抗拒,因為演算法效率不高,又使用python語言。但總體思路還是清晰的。思路2:使用master公式求時間複雜度為o(nlogn)
觀察思路1可發現它對於乙個節點多次判斷導致效率低下。因此做出修正,對乙個數的判斷自下而上,判斷其子樹是否是平衡的,若不平衡直接結束程式。這樣每個節點最多被判斷一次,極大地提公升了效率。**2:
# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class solution:
def depth(self,root):
if root==none:
return 0
left=self.depth(root.left)
if left==-1:
return -1
right=self.depth(root.right)
if right==-1:
return -1
return -1 if abs(left-right)>1 else 1+max(left,right)
def isbalanced(self, root):
""":type root: treenode
:rtype: bool
"""return self.depth(root)!=-1
分析3:
本方法思路**參考
leetcode 110 平衡二叉樹 平衡二叉樹
leetcode 110 平衡二叉樹 平衡二叉樹要求所有節點的左右子樹的高度差小於1,因此,只需在遍歷的時候返回其左右子樹的深度。definition for a binary tree node.public class treenode treenode int val treenode int...
LeetCode110 平衡二叉樹
給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回true。示例 2 給定二叉樹 1,2,2,3,3,null,nul...
LeetCode 110 平衡二叉樹
給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回true。示例 2 給定二叉樹 1,2,2,3,3,null,nul...