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

二叉树——6.平衡二叉树

时间:2024-08-10 10:26:46浏览次数:6  
标签:right return get self height 二叉树 平衡 left

力扣题目链接

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

示例:

Ture

False

首先做这道题目前要明白什么是平衡二叉树?平衡二叉树的定义是,对于二叉树的每一个节点,它的左子树和右子树的高度差不超过1。结合示例中的两个例子理解平衡二叉树的定义。

完整代码如下:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        if self.get_height(root) != -1:
            return True
        else:
            return False

    def get_height(self, root: TreeNode) -> int:
        # Base Case
        if not root:
            return 0
        # 左
        if (left_height := self.get_height(root.left)) == -1:
            return -1
        # 右
        if (right_height := self.get_height(root.right)) == -1:
            return -1
        # 中
        if abs(left_height - right_height) > 1:
            return -1
        else:
            return 1 + max(left_height, right_height)

首先我们看一下代码的整体框架:

Solution类中包含两个方法:

  1. isBalanced:用于判断整棵树是否是平衡二叉树。
  2. get_height:用于计算一个节点的高度,同时判断该节点的子树是否平衡。

在isBalanced函数中,接收一个二叉树的根节点root作为输入。调用get_height方法来获取树的高度,如果get_height返回的结果不为-1,则表示树是平衡的,返回True;否则返回False。

get_height函数中如果当前节点为空,则返回0

        # 左
        if (left_height := self.get_height(root.left)) == -1:
            return -1
        # 右
        if (right_height := self.get_height(root.right)) == -1:
            return -1

分别利用递归计算左右子树的高度,通过递归调用get_height函数,然后将左子树高度存储在left_height中,如果left_height等于-1,说明左子树不平衡,返回-1。右子树同理。代码中的:=代表什么?:=是Python 3.8 引入的“海象运算符”(Walrus Operator)。它的作用是将表达式的值赋给一个变量,并返回这个值。这种语法允许你在一个表达式内部进行赋值,从而可以在一行代码中完成赋值和使用的操作。简单来讲就是为了代码简洁性,完整代码应该是这样的:

left_height = self.get_height(root.left)
if left_height == -1:
    return -1

接着判断平衡性:

        if abs(left_height - right_height) > 1:
            return -1
        else:
            return 1 + max(left_height, right_height)

如果左右子树高度差大于1,那也是不平衡的,其余的返回节点高度。这里可能有疑问,为什么要返回节点高度?在isBalanced中只要不等于-1不就返回True了么,那我对于满足的只要不返回-1不就行了么?但你这是在递归,你在一层中随意返回一个不等于-1的值,那其余层递归内,怎么确定节点高度?所以还是得返回节点高度,是为了下一层或者上一层递归的正确性。

标签:right,return,get,self,height,二叉树,平衡,left
From: https://blog.csdn.net/plutomty/article/details/141086611

相关文章

  • 二叉树(基础知识介绍)
    1.树概念及结构1.1树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的......
  • 二叉树中的重点知识
     接上一篇二叉树基础知识,上一篇链接为:写文章-CSDN创作中心3.二叉树的顺序结构及实现3.1二叉树的顺序结构普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存......
  • 数据结构之二叉树的顺序存储结构与链式存储结构
    一、顺序存储结构1.定义与特点顺序存储结构是指用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。完全二叉树和满二叉树采用顺序存储比较合适,因为它们的结点序号可以唯一地反映结点之间的逻辑关系,从而既能最大地节省存储空间,又能利用数组元......
  • 检查括号和方括号是否平衡
    我需要编写一个函数,给出带有括号和/或方括号的字符串,它能够评估它们是否以正确的顺序出现。例如,在此字符串'([b])(aa)'中,您可以看到每次打开括号或方括号时,它都会在正确的位置关闭。但是,像“[(a])”这样的字符串不会以正确的顺序关闭括号或方括号,因为它应该是“[(a)]”。该......
  • 数据结构-树与二叉树
    王道章节内容知识框架考纲内容引入因为要用到查找的部分知识,故简要引入。要从数据中找到一个值,有静态查找(未发生插入和删除)和动态查找(发生插入和删除)两种方式。而静态查找有两种方法,一种是逐个按顺序查找,一种是高中就有介绍的二分查找。自然而然,我们可以类似地有这......
  • C++ 根据层序遍历数组 构造二叉树
    说明该层序遍历数组中空节点会使用-1代替,即该层序遍历数组可以理解为一个完全二叉树代码利用队列实现左右子节点的存储,每次通过获取队列头部元素即为当前头节点,然后在数组中i和i+1对应该头结点下的左右子节点,如果不为-1,那么说明可以入队。structTreeNode{intval;Tree......
  • LeetCode144 二叉树的前序遍历
    前言题目:144.二叉树的前序遍历文档:代码随想录——二叉树的递归遍历编程语言:C++解题状态:基础知识不了解思路两种思路,第一是递归。递归算法有三个要素。每次写递归,都按照这三要素来写!确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就......
  • 二叉树的递归套路
    二叉树的递归套路二叉树结构二叉树是一个将数据组织成头尾相连的特殊链表,每一个数据单元与链表一样有一个指向其的指针,但与链表不同的是其可以有两个指向其他单元的指针,分别是其左孩子与右孩子。采用该这种结构,最终数据的呈现形式会与“链”不一样,而呈现出了一种树的结构。对......
  • Java数据结构 | 二叉树基础及基本操作
    二叉树一、树型结构1.1树的概念1.2关于树的一些常用概念(很重要!!!)1.3树的表示形式1.4树的应用二、二叉树2.1二叉树的概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的存储2.5二叉树的基本操作2.5.1代码说明2.5.2二叉树的遍历2.5.3二叉树的基本操作1、获取树......
  • 不平衡学习的自适应合成采样方法ADASYN(Matlab代码实现)
     ......