剑指offer:平衡二叉树

风格不统一 提交于 2020-03-17 03:14:19

题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。

方法一
递归计算左右子树高度,并且判断左右子树是否也是平衡二叉树。
但这样判断上层结点时会重复遍历下层结点,增加开销。

# -*- 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
        if not pRoot:
            return True
        left=self.depth(pRoot.left)
        right=self.depth(pRoot.right)
        return abs(left-right)<=1 and self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right)
    def depth(self,root):
        if root==None:
            return 0
        return 1+max(self.depth(root.left),self.depth(root.right))

方法二
如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。

# -*- 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
        if not pRoot:
            return True
        result=self.depth(pRoot)
        if result==-1:
            return False
        else:
            return True
    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
        if abs(left-right)>1:
            return -1
        else:
            return 1+max(left,right)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!