首页 > 其他分享 >110. 平衡二叉树

110. 平衡二叉树

时间:2023-12-09 16:24:26浏览次数:44  
标签:right return self 高度 二叉树 平衡 left root 110

目录

题目

  • 给定一个二叉树,判断它是否是高度平衡的二叉树。

    本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

自顶向下

  • 首先,对当前节点进行处理,计算左孩子的高度,右孩子的高度,两者高度差若大于1返回False,否则返回True,递归判断左子树、右子树
class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if root is None:
            return True
        #根
        a,b=0,0
        #如果有左孩子a+1,一直往下走到没有左孩子的地方
        while root.left is not None :
            a+=1
            root=root.left
        #如果有右孩子b+1,一直往下走到没有右孩子的地方
        while root.right is not None :
            b+=1
            root=root.right
        #如果a-b或者b-a的值大于1,返回F,否则返回T
        if a-b >1 or b-a >1:
            return False
        else :
            return True
        #递归左
        return self.isBalanced(root.left)
        #递归右
        return self.isBalanced(root.right)
  • 只能判断每个节点的左右子树的高度差是否小于等于1,但并未考虑整棵树的平衡性。比如[1,2,3,4,5,6,null,8],上述代码求的左子树高为a=3,右子树高为b=1,而实际右子树的高度为2,问题出在计算b的时候只往右走,实际的高度是左右里面较大的一个才对。

自顶向下正解

class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if root is None:
            return True
        # 计算左子树的高度
        left_height = self.get_height(root.left)
        # 计算右子树的高度
        right_height = self.get_height(root.right)

        # 判断当前节点的左右子树高度差是否大于1
        if left_height-right_height >1 or right_height-left_height >1:
            return False
        #######这个地方不能写返回True,返回了后面就不会对左右子树进行判断了######
        # else :
        #     return True
        #递归左
        return self.isBalanced(root.left) and self.isBalanced(root.right)
        #####左右子树的递归不可以分开写,会导致左子树返回了,右子树没执行######
        # return self.isBalanced(root.left)
        # #递归右
        # return self.isBalanced(root.right)

    def get_height(self, node):#求树的高度
        if node is None:
            return 0
        #树的高度为:左子树高度和右子树高度较大的一个并+1
        return max(self.get_height(node.left), self.get_height(node.right)) + 1

自底向上(优)

class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        def recur(root):
            # 递归函数,计算每个节点的高度并判断子树是否平衡
            if not root:
                return 0  # 空节点的高度为0

            # 递归计算左子树的高度
            left = recur(root.left)
            if left == -1:
                return -1  # 左子树不平衡,直接返回-1

            # 递归计算右子树的高度
            right = recur(root.right)
            if right == -1:
                return -1  # 右子树不平衡,直接返回-1

            # 判断当前节点的左右子树高度差是否大于1
            if abs(left - right) > 1:
                return -1  # 左右子树高度差大于1,返回-1表示不平衡

            # 返回左右子树中较大的高度加1作为当前子树的高度
            return max(left, right) + 1

        # 调用递归函数判断整棵树是否平衡
        return recur(root) != -1

标签:right,return,self,高度,二叉树,平衡,left,root,110
From: https://www.cnblogs.com/lushuang55/p/17890911.html

相关文章

  • 平衡树
    平衡树平衡树有好多种,边学边写吧~。目录序号类型1Treap2Splay3FHQTreap4红黑树5替罪羊树6LinkCutTree前置芝士二叉搜索树BST简介二叉搜索树是一种二叉树的树形数据结构,其定义如下:空树是二叉搜索树。若二叉搜索树的左子树不为空,则......
  • 多开工具对游戏平衡性与公平性的影响评估
    多开工具对游戏平衡性与公平性的影响评估摘要:随着网络游戏的普及,一些玩家开始使用多开工具来同时运行多个游戏账号。然而,这种行为引发了一系列讨论,涉及到游戏的平衡性和公平性问题。本文将评估多开工具对游戏平衡性与公平性的影响,并提出相应的观点。引言:多开工具是一种允许玩......
  • 4.对称二叉树
    101.对称二叉树1、概要给你一个二叉树的根节点root,检查它是否轴对称。判断对称二叉树要比较的不是左右节点!是根节点的左子树与右子树是不是相互翻转。其实要比较的是两个树,即根节点的左右子树。两个子树的里侧和外侧是否相等。只能是“后序遍历”,要通过递归函数的返回......
  • 3.翻转二叉树
    226.翻转二叉树1、概要给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。想要翻转它,其实就把每一个节点的左右孩子交换一下就可以关键在于遍历顺序选择哪一种,遍历的过程中去翻转每一个节点的左右孩子就可以达到翻转效果。中序不方便,会把某些节点的左右孩子翻转......
  • 全局平衡二叉树学习笔记 && [SDOI2017]切树游戏解题报告
    首先,任何一个卡树剖的出题人都很没有素质前言2023年8月22日,XDFnoip模拟赛场上,神犇liuhangxin自己发明了矩阵乘法维护FWT,可是出成绩的时候发现本题挂了30分。2023年9月22日,菜鸡cool_milo看到了liuhangxin的题解,但是由于太菜,并没有看懂。2023年10月22日,菜......
  • 2.二叉树层序遍历
    107.二叉树的层序遍历II相对于102.二叉树的层序遍历,就是最后把result数组反转一下就可以了。classSolution{//利用链表可以进行o(1)头部插入publicLinkedList<List<Integer>>res=newLinkedList<List<Integer>>();publicList<List<Integer>>levelOrd......
  • 1.二叉树
    二叉树的种类满二叉树满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。完全二叉树完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边......
  • 第7章. 平衡二叉搜索树
    平衡二叉搜索树(BalancedBinarySearchTree)1.1二叉搜索树存在的问题添加、删除节点时,都可能导致二叉搜索树退化成链表。为了防止二叉搜索树退化成链表,让添加、删除搜索的复杂度维持在O(logn),提出平衡的概念。1.2平衡(Balance)平衡:当节点数量固定时,左右子树的高度越......
  • 第5章. 二叉树
    二叉树一、树的基本概念节点、根节点、父节点、子节点、兄弟节点一棵树可以没有任何节点,称为空树一棵树可以只有一个节点,也就是只有根节点子树、左子树、右子树节点的度:子树的个数树的度:所有节点度中的最大值叶子节点:度为0的节点非叶子节点:度不为0的节点层数:根节点......
  • 17_二叉树的所有路径
    二叉树的所有路径给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例1:输入:root=[1,2,3,null,5]输出:["1->2->5","1->3"]示例2:输入:root=[1]输出:["1"]【思路】题目要求从根节点到叶子的路径,所以需要......