力扣题---平衡二叉树

题目链接:平衡二叉树

先来看题目与例题:

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

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 

示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:

输入:root = []
输出:true

这题其实就是对计算二叉树层数的一种运用

简单来说 就是某一个结点,它的兄弟节点的层数不能比它大2层(大一层则可以)

那么这题就是计算每一个节点,它的兄弟节点是否比他大2层

这里需要用到计算层数的函数,若不理解计算层数函数思路可以去看看这篇数据结构-二叉树-更新完整版​​​​​​


1.首先我们要判断题目是否只给了一个头节点,若只给了一个头节点要进行处理,因为一个头节点它没有左子树,也没有右子树,更没有兄弟节点,那么它的层数不大于2,则返回true

2.到这里,说明二叉树是有左、右子节点的

3.那么我们创建两个变量,分别计算它的左、右子树的层数大小

4.然后我用到abs函数(这个函数是用来计算两个数相减的绝对值)

5.当这个函数返回了小于2得值时,说明这层节点是平衡得的

6.那么我们继续递归调用它得右子与左子

7.当递归完,他们依旧返回true说明该树是平衡二叉树,若不是,则不是平衡二叉树

若还不理解,力扣题里面的动图解释的很详细!有需要的可以去看看!

int BreeKlevelSize(struct TreeNode* root)//用来计算节点的高度函数
{
    if(root==NULL)
    return 0;

    int left=BreeKlevelSize(root->left);
    int right=BreeKlevelSize(root->right);

    return left>right?left+1:right+1;
}

bool isBalanced(struct TreeNode* root){
   if(root==NULL)//当root为空 说明该树是空的
   return true;

   int left=BreeKlevelSize(root->left);//去计算左子的高度
   int right=BreeKlevelSize(root->right);//计算右子的高度

   return abs(left-right)<2//让左子-右子计算绝对值
   && isBalanced(root->left)//继续去调用该节点的左子
   && isBalanced(root->right);//继续u调用该节点的右子
}

若本篇对您有帮助,希望能获得您的赞!

你可能感兴趣的:(数据结构,二叉树,力扣,leetcode,算法,动态规划)