https://leetcode.com/problems/balanced-binary-tree/
第一种方法,不但要保证当前节点左右子树平衡,而且他们的各自的孩子节点也要平衡。因此每一个节点都递归调用getDepth(),重复计算开销较大,时间复杂度为O(nlogn)。
class Solution:
def isBalanced(self, root: TreeNode) -> bool:
if root == None:
return True
leftDepth = self.getDepth(root.left)
rightDepth = self.getDepth(root.right)
return abs(leftDepth-rightDepth) <= 1 and self.isBalanced(root.left) and self.isBalanced(root.right)
def getDepth(self, node):
if node == None:
return 0
return max(self.getDepth(node.left), self.getDepth(node.right))+1
第二种方法,利用一个标记变量,每次在递归函数里判断左右子树高度是否平衡,如果不平衡跳出递归,结束函数。因此不必一个节点遍历多遍,时间复杂度为O(n)。
class Solution:
def isBalanced(self, root: TreeNode) -> bool:
if root == None:
return True
balanced = [True]
self.getDepth(root, balanced)
return balanced[0]
def getDepth(self, node, balanced):
if node == None:
return 0
leftDepth = self.getDepth(node.left, balanced)
rightDepth = self.getDepth(node.right, balanced)
if abs(leftDepth - rightDepth) > 1:
balanced[0] = False
return -1
return max(leftDepth, rightDepth)+1