平衡二叉树

36 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

一、题目

LeetCode II. 平衡二叉树

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

二、题解

给定一个二叉树,判断改二叉树是不是平衡二叉树,平衡二叉树就是子树节点的高度差不能超过1,对于子树的子树也是这样的,那么就是平衡二叉树。

方法一

对此可以通过递归遍历二叉树来校验,计算每个节点路径的高度,然后判断左右子树的高度差,如果左右子树的高度差不超过1的话就继续遍历。具体的首先需要计算出一个子树的高度, 这里可以使用dfs深度优先搜索来遍历计算高度,递归方法getHeight计算树高度,如果root树节点为空就返回高度0,否则递归的计算root树的左子树高度和root树的右子树高度,保留最大的一个子树高度,最终返回计算的高度加一。 然后就可以判断是否平衡二叉树了,如果root树节点为空则返回true表示也算是平衡二叉树,否则就计算左子树的高度和右子树的高度差,如果高度差大于1的话就不是平衡二叉树,否则有可能是平衡二叉树,还 需要递归的判断左子树节点和右子树节点。

方法二

方法一可能会重复的计算的节点路径高度,因此可以后序遍历二叉树计算树高度返回来判断。

三、代码

方法一 Java代码

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

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

时间复杂度:O(n^2),需要先计算树高度和遍历子树判断。

空间复杂度:O(n),递归的消耗栈空间。


方法二 Java代码

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

    private int getHeight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = getHeight(root.left);
        if (left == -1) {
            return -1;
        }
        int right = getHeight(root.right);
        if (right == -1) {
            return -1;
        }
        if (Math.abs(left - right) > 1) {
            return -1;
        }
        return Math.max(left, right) + 1;
    }
}

时间复杂度:O(n),需要遍历二叉树节点。

空间复杂度:O(n),递归的消耗栈空间。