leetcode 110.平衡二叉树

leetcode 110.平衡二叉树

题目描述

给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:

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

示例 1:
给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回 true

示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]

       1
      / \
     2   2
    / \
   3   3
  / \
 4   4

返回 false

解题思路

平衡二叉树的概念:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。

这个概念就说明了一个二叉树,如果是平衡二叉树,就要保证以每个节点为根节点的子二叉树都是平衡二叉树,那么整个树才是平衡二叉树。

那么就需要考虑下面的情况:

  • 左子树是平衡二叉树,否则直接返回false
  • 右子树是平衡二叉树,否则直接返回false
  • 每个子树的高度
  • 计算左右子树的高度差是否小于等于1,否则也直接返回false

根据上述的叙述实现代码

/**
 * 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 == NULL){
            return true;
        }
        if(!isBalanced(root->left)) return false;  // 左子树是否为平衡二叉树
        if(!isBalanced(root->right)) return false; // 右子树是否为平衡二叉树

        // 获取左右子树的高度
        int left = depth(root->left);
        int right = depth(root->right);

        return abs(left-right) <= 1? true:false; // 计算高度差是否符合
    }
    
    /*
    *  	获取左右子树的高度
    */ 
    int depth(TreeNode* root){
        // 节点为空,深度为0
        if(root == NULL){
            return 0;
        }
        // 叶子节点的深度为1
        if(root->left == NULL && root->right == NULL){
            return 1;
        }
        int left = depth(root->left); // 左子树的高度
        int right = depth(root->right);  // 右子树的高度

        return left>=right?left+1:right+1;  // 那个子树的高度较高,在此基础上加1
    }
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

发布了154 篇原创文章 · 获赞 210 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/EngineerHe/article/details/104250443