美文网首页每日一练
每日一练(28):平衡二叉树

每日一练(28):平衡二叉树

作者: 加班猿 | 来源:发表于2022-03-01 10:01 被阅读0次

    title: 每日一练(28):平衡二叉树

    categories:[剑指offer]

    tags:[每日一练]

    date: 2022/03/01


    每日一练(28):平衡二叉树

    输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过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 。

    限制:

    0 <= 树的结点个数 <= 10000

    来源:力扣(LeetCode)

    链接:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof

    方法一:后序遍历(DFS)

    dfs计算思路:

    • 对于空结点,深度为0

    • 当前深度是左右子树深度的最大值+1, 有效情况直接返回深度

    • 一旦发现左右子树的深度差异超过1,则认为无效,返回-1

    • 一旦发现返回是-1, 直接返回-1

    bool isBalanced(TreeNode* root) {
        return (dfs(root) != -1);
    }
    int dfs(TreeNode* node) {
        if (node == nullptr) {
            return 0;
        }
        int left = dfs(node->left);
        if (left == -1) {
            return -1;
        }
        int right = dfs(node->right);
        if (right == -1) {
            return -1;
        }
        return abs(left - right) > 1 ? -1 : max(left, right) + 1;//当前深度是左右子树深度的最大值+1, 有效情况直接返回深度
    }
    

    方法二:前序遍历

    对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差是否不超过 11,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。这

    是一个自顶向下的递归的过程

    int height(TreeNode* root) {
        if (root == nullptr) {
            return 0;
        }
        return max(height(root->left), height(root->right)) + 1;
    }
    bool isBalanced(TreeNode* root) {
        if (root == nullptr) {
            return true;
        }
        return abs(height(root->left) - height(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
    }
    

    相关文章

      网友评论

        本文标题:每日一练(28):平衡二叉树

        本文链接:https://www.haomeiwen.com/subject/cejdrrtx.html