zoukankan      html  css  js  c++  java
  • 剑指offer39-平衡二叉树

    题目描述

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

    在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树

    示例

    输入      {1,2,3,4,5,6,7}

    返回值   true

    知识点回顾

    树、DFS

    代码

    解法一:自上而下的方法,需要借助JZ38二叉树深度

    判断一个数是否为平衡二叉树。平衡二叉树是左子树的高度与右子树的高度差的绝对值小于等于1,同样左子树是平衡二叉树,右子树为平衡二叉树。

    根据定义,如果我们能够求出以每个结点为根的树的高度,然后再根据左右子树高度差绝对值小于等于1,,就可以判断以每个结点为根的树是否满足定义。
    我们可以用JZ38求高度。

    然后再用先序遍历:根节点、左子树、右子树来判断以每个结点为根的树是否满足条件。

    # -*- 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 pRoot is None:
                return True
            if abs(self.TreeDepth(pRoot.left)-self.TreeDepth(pRoot.right))>1:            #根
                return False
            else:
                return self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right)  #左右
    /*根左右这块if-else可以改造为一个return:
    return abs(self.TreeDepth(pRoot.left)-self.TreeDepth(pRoot.right))<=1 and
    self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right) #根左右

    */
    def TreeDepth(self, pRoot): # JZ38 if pRoot is None: return 0 left=self.TreeDepth(pRoot.left)+1 right=self.TreeDepth(pRoot.right)+1 return max(left,right)

    解法二:自下而上的方法

    方法一是先求出以每个结点为根的树的高度,然后再判断,其实可以直接再求高度的同时,直接判断即可。
    利用后序遍历:左子树、右子树、根节点,可以先递归到叶子节点,然后在回溯的过程中来判断是否满足条件。

    对求树的高度的代码JZ38加以改造,如果不满足平衡二叉树的定义,则返回-1,并且如果左子树不满足条件了,直接返回-1,右子树也是如此,相当于剪枝,加速结束递归。

    最后只需要判断depth(root)返回的是否为-1,如果是-1,则不是,否则,则是。

    时间复杂度:O(N)
    空间复杂度:O(N)

    # -*- 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
            return self.TreeDepth(pRoot)!=-1
        def TreeDepth(self, pRoot):
            if pRoot is None:
                return 0
            left=self.TreeDepth(pRoot.left)+1
            if left==0:
                return -1
            right=self.TreeDepth(pRoot.right)+1
            if right==0:
                return -1
            if abs(left-right)>1:   #一旦某结点不满足就返回-1结束
                return -1
            else:
                return max(left,right)
  • 相关阅读:
    A. Generous Kefa
    1031 骨牌覆盖
    1074 约瑟夫环 V2
    1073 约瑟夫环
    1562 玻璃切割
    Ants
    1024 矩阵中不重复的元素
    1014 X^2 Mod P
    1135 原根
    1010 只包含因子2 3 5的数
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14082899.html
Copyright © 2011-2022 走看看