LeetCode/平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树
平衡二叉树满足子树都为平衡二叉树且左右子树高度差的绝对值小于1

1. 平衡性和高度判断分离

从上往下对每一个节点判断其左右子树的高度是否满足要求
以及其左右子树是否是平衡二叉树
时间复杂度为O(n2)
可以发现对每个节点进行最大高度计算时,其实跟其子节点的最大高度计算重复了很多遍

遍历+高度计算
class Solution {
public:
    int height(TreeNode* root) {
        if (root == NULL) return 0;
        //递归计算最大高度
        else return max(height(root->left), height(root->right)) + 1;}
    bool isBalanced(TreeNode* root) {
        if (root == NULL) return true;
        //进行左右子树高度、平衡性判断
       else return abs(height(root->left)-height(root->right))<=1&&isBalanced(root->left)&&isBalanced(root->right);
    }
};

2. 自底向上

我们可以在方法一计算最大高度的同时,进行平衡性的判断,只用遍历一遍即可得到结果

class Solution {
public:
    int height(TreeNode* root) {
        if (root == NULL) return 0;//高度为0
        int leftHeight = height(root->left);//递归左节点并得到其高度
        if(leftHeight==-1) return -1;//用于打断右节点的递归
        int rightHeight = height(root->right);//递归右节点并得到其高度
        //不满足高度条件,传递回一个-1标志,同时打断在获得标志的情况打断运算和递归
        if (leftHeight==-1||rightHeight==-1||abs(leftHeight-rightHeight)>1)  return -1;
        else  return max(leftHeight, rightHeight) + 1;
    }
    bool isBalanced(TreeNode* root) {
        return height(root) >= 0;
    }
};
posted @ 2022-05-20 00:14  失控D大白兔  阅读(13)  评论(0编辑  收藏  举报