zoukankan      html  css  js  c++  java
  • 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 
  • 相关阅读:
    failed to push some refs to 'git@github.com:laniu/liuna.git'报错原因
    ECMAScript和JavaScript的关系
    js面试总结
    第16章 脚本化css
    代理模式
    SQL
    VS
    Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法
    SQL
    C#
  • 原文地址:https://www.cnblogs.com/ditingz/p/12148803.html
Copyright © 2011-2022 走看看