平衡二叉树答案唯一吗

给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 输入:root = [3,9,20,null,null,15,7] 输出:true 思路一: 对每一个节点进行递归处理

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

本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1
在这里插入图片描述
输入:root = [3,9,20,null,null,15,7]
输出:true

思路一: 对每一个节点进行递归处理

 如何计算二叉树中任意一个节点的高度?

h e i g h t = m a x ( h e i g h t ( p . l e f t ) , h e i g h t ( p . r i g h t ) ) + 1 ; p 是 非 空 节 点 height=max(height(p.left), height(p.right)) +1;p是非空节点 height=max(height(p.left),height(p.right))+1;p
h e i g h t = 0 ; p 是 非 空 节 点 height=0;p是非空节点 height=0;p

 递归的计算每一个节点

  • 遍历到当前节点,并计算左右子树的高度,如果高度差大于1,返回false
  • 递归的遍历左子树与右子树

class Solution {
private:
    int depthTree(TreeNode* root){
        if(root == NULL) {
            return 0;
        }
        return max(depthTree(root->left), depthTree(root->right)) + 1;
    }
public:
    bool isBalanced(TreeNode* root) {
        if(root == NULL){
            return true;
        }
        return abs(depthTree(root->left) - depthTree(root->right)) <= 1 
        		&& isBalanced(root->left) 
        		&& isBalanced(root->right);
    }
};

思路二: 从底往上对每一个节点进行递归

 感受一下“后序遍历”

  • 对于当前遍历到的节点,先递归的判断其左右子树是否平衡
  • 再判断当前节点是否平衡
class Solution {
private:
    int depthTree(TreeNode* root) {
        if(root == NULL){
            return 0;
        }
        int left = depthTree(root->left);
        int right = depthTree(root->right);
        if(left == -1 || right == -1 || abs(left - right) > 1) {
            return -1;
        }else {
            return max(left, right) + 1;
        }
    }
public:
    bool isBalanced(TreeNode* root) {
        return depthTree(root) >= 0;
    }
};
知秋君
上一篇 2024-08-03 07:12
下一篇 2024-08-02 22:48

相关推荐