newcode-平衡二叉树
题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
解析
“平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
自己提交代码:
思路:根据求树深度的方法,求当前节点左右子树最大深度并判断当前节点是否符合平衡二叉树的定义,若符合则分别对左右子树进行这种操作判断是否符合。
耗时:运行时间: 46 ms 占用内存:5624K(用递归比较慢)
代码:
class Solution: def IsBalanced_Solution(self, pRoot): # write code here if pRoot==None: return True left = self.DfsHelper(pRoot.left) right = self.DfsHelper(pRoot.right) if (left-right>1 or left-right<-1): return False else: leftBalance = self.IsBalanced_Solution(pRoot.left) rightBalance = self.IsBalanced_Solution(pRoot.right) if leftBalance==True and rightBalance==True: return True def DfsHelper(self, pRoot): if pRoot==None: return 0 left = self.DfsHelper(pRoot.left) right = self.DfsHelper(pRoot.right) if left>right: result = left+1 else: result = right+1 return result
改下求深度的算法:运行时间为28ms,5752k。
def DfsHelper(self, pRoot): if pRoot==None: return 0 stack = [(pRoot,1)] result = 1 while(stack): root,count = stack.pop() if root.left: stack.append((root.left,count+1)) if count+1>result: result = count+1 if root.right: stack.append((root.right,count+1)) if count+1>result: result = count+1 return result
进阶:(但是其实自己对剪zhi还不是特别了解)
这种做法有很明显的问题,在判断上层结点的时候,会多次重复遍历下层结点,增加了不必要的开销。如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。
class Solution: def IsBalanced_Solution(self, pRoot): return self.dfsHelper(pRoot)!=-1 def dfsHelper(self,pRoot): if pRoot==None: return 0 left = self.dfsHelper(pRoot.left) if left==-1: return -1 right = self.dfsHelper(pRoot.right) if right == -1: return -1 return max(right,left)+1 if abs(right-left)<=1 else -1