【LeetCode】做题家之110 Balanced Binary Tree

请看题

Given a binary tree, determine if it is height-balanced



解题思路

在我看来,所有关于二叉树的题目都可以使用递归来解决。那么在这里,在第三个例子中节点为空,那么此树必定为平衡。根据这个条件,我们可以写出如果节点为空直接返回true

if(root == nullptr)
{
    return true;
}

已经解决了第一种情况。接下来看另外几种情况。

如果左节点失衡和如果右节点失衡

这里最大的问题就是怎么去判断节点是否失衡呢?

站在前人的肩膀上,我想到了我可以写一个函数来获取树的高度,请看代码

int treeHeight(TreeNode *node)
{
    if(node == nullptr)
    {
        return 0;
    }
    return 1 + (max(treeHeight(node->left), treeHeight(node->right)));
}

treeHeight函数能够为我们获取到树的高度,这里有两个知识点,其一为递归思想,其二为max函数

递归思想

使用递归,可以很好的解决怎么去获取树的高度的问题,一直通过递归调用自身获取左节点或右节点的高度,如果当前的节点为空,那么就说明已经事高度为0或者事高度为上一个节点值。一直重复,直到获取到空值。

max函数

在使用递归的时候,返回的值会有两个,在这里需取最大的那个值来作为我们树的高度


我们已经知道怎么取获取树的高度了,现在就可以来进行第二种判断了

从父节点开始,获取左右节点的各自高度,如果其绝对值超于1,那么为不平衡,返回false

可以写出代码

if(abs(leftNode - rightNode) > 1)
{
    return false;
}

第三种情况

如果左节点的左右不平衡或者右节点的左右不平衡

根据前面我们已经写出的函数,可以进行以下判断

bool left = isBalanced(root->left);
bool right = isBalanced(root->right);
return left && right;

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    int height(TreeNode *root)
    {
        if(root == nullptr)
        {
            return 0;
        }
        return 1 + (max(height(root->left), height(root->right)));
    }

    bool isBalanced(TreeNode* root) 
    {
        if(root == nullptr)
        {
            return true;
        }
        int leftNode = height(root->left);
        int rightNode = height(root->right);
        if(abs(leftNode - rightNode) > 1)
        {
            return false;
        }
        bool left = isBalanced(root->left);
        bool right = isBalanced(root->right);
        
        return left && right;
    }
};
5 个赞

看不懂,但是必须盖楼