Loading

力扣 - 110. 平衡二叉树

题目

110. 平衡二叉树

思路1(自顶向下的递归)

  • 要判断是否为平衡二叉树,那么首先就判断他的左右子树高度差有没有超过1,没有超过1的话就继续判断他的左右子树是否为平衡二叉树
  • 将大问题分成小问题进行解决,自顶向下
  • 判断高度用dfs来计算

代码

class Solution {
    public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        }
        if (Math.abs(dfs(root.left) - dfs(root.right)) > 1) {
            return false;
        }
        return isBalanced(root.left) && isBalanced(root.right);
    }

    public int dfs(TreeNode node) {
        if (node == null) {
            return 0;
        }
        return Math.max(dfs(node.left), dfs(node.right)) + 1;
    }
}

复杂度分析

  • 时间复杂度:\(O(N^2)\),其中 N 为树的节点的个数
  • 空间复杂度:\(O(N)\),其中 N 为树的节点的个数

思路2(自底向上的迭代)

  • 如果使用自顶向下的递归,很多节点会被重复计算,导致时间复杂度很大
  • 所以可以使用自底向上方法,有点类似于后序遍历,先遍历最底部左右两个树,如果平衡就返回平衡,一步步向上迭代
  • 这样子节点最多只会被计算一次了,不会出现重复计算的问题了

代码

class Solution {
    public boolean isBalanced(TreeNode root) {
        return height(root) >= 0;
    }

    public int height(TreeNode node) {
        if (node == null) {
            return 0;
        }
        int leftHeight = height(node.left);
        int rightHeight = height(node.right);
        // 如果左子树不平衡或者右子树不平衡或者当前树不平衡都会返回-1代表树不平衡
        if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) {
            return -1;
        } else {
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\),其中 N 为树的节点的个数
  • 空间复杂度:\(O(N)\),其中 N 为树的节点的个数
posted @ 2020-11-22 17:16  linzeliang  阅读(108)  评论(0)    收藏  举报