二叉树的学习之旅(6)——平衡二叉树

本文详细解析了如何判断一个二叉树是否为高度平衡的二叉树,通过递归求解每个节点的左右子树高度差,确保其不超过1,从而实现平衡二叉树的判定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平衡二叉树

题目描述

给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。

解题思路

高度平衡二叉树,在之前做过的树的深度的题的基础上,求解每个节点的高度(深度)判断其左右子树的高度差的绝对值不超过1即可。

函数返回值为bool型。返回return ture/false。或者返回return 返回值为true/false的函数地址(对地址返回值进行逻辑运算)

  1. 首先判断节点为空的话,该节点的左右子树一定满足高度平衡。return true;
  2. 建立整型变量来存储当前节点的左右子树高度(调用求高度函数),并进行比较判断。 int left,right;left=TreeDepth(root->left);right=TreeDepth(root->right);
  3. 先判断,如果左右子树的高度同时小于等于1,那么一定满足高度平衡。(这也是递归的终止条件,表示最后叶节点的高度)if(left<=1&&right<=1)return ture;
  4. 如果当前节点不是叶节点,那么判断当前节点的左右子树的高度差绝对值<=1。如果满足,那么当前节点平衡,需要继续判断下一步节点的左右子树节点是否都平衡;如果不满足,那么久不是平衡二叉树。if(abs(left-right)<=1) {return (isBalanced(root->left)&&isBalance(root->right));}else return false;
  5. 编写要调用的高度函数在求树的深度那一题里面写过。强调函数定义:int TreeDepth(TreeNode* root)
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isBalanced(TreeNode* root) 
    {
        if(!root) return true;
        int left,right;
        left=TreeDepth(root->left);
        right=TreeDepth(root->right);
        if(left<=1&&right<=1) return true;
        if(abs(left-right)>1)
        {return false;}
        else
        {return (isBalanced(root->left)&&isBalanced(root->right));}
    }
    int TreeDepth(TreeNode* pNode)
    {
        if(!pNode) return 0;
        int left=TreeDepth(pNode->left)+1;
        int right=TreeDepth(pNode->right)+1;
        return left>right?left:right;
    }
};

重点要记忆:

1、因为第一次接触返回bool值的函数,在返回值这里查缺补漏。重新刷一遍之前的题,重点留意了一下不同类型函数定义,以及不同返回类型。void、int、TreeNode*、bool

2、对递归终止条件的认识不深,以前的if(!pNode) return nullptr;以及if(!pNode) return 0;等等,都是递归的终止条件,到的是空节点停止递归。而本题是用深度条件来提前结束递归,不然就得等到if(!root) return true。But,我将提前结束递归注释掉之后也没问题。TAT我凌乱了,不过这让我注意到递归的终止条件的存在感,编写递归时,先想想终结条件,并写在第一句上 很重要!

3、高度差的绝对值:abs(),第一遍编写的时候忘了加绝对值,所以只通过了一半。很重要!

4、bool函数递归调用,return ()。

按照镜像二叉树的学习,我一开始直接写成了(isBalanced(root->left),isBalance(root->right)),编译能通过,结果会错误,因为它们没有进行与运算,不同时满足左右子树,输出的结果只是将最后的右子树是不是平衡的判断结果发出来。

所以一定要记得,什么时候需要左右子树都满足的&&返回,什么时候分别用“,”返回。我觉得我还会犯这错误,记一下

5、编写深度(高度函数时),对于函数定义那一块的编写不了解。之前刷题只注意函数内的程序编写,没注意函数的定义书写

这一点在之后刷题时一定要惊醒!这不仅关系着返回值编写,还关系着以后遇到问题需要单独编写时 不会编的问题

int TreeDepth(TreeNode* pNode){}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值