判断二叉树是否平衡

判断二叉树是否平衡

问题

这个题目说的是,给你一棵二叉树,你要判断它是否平衡。这里平衡指的是,对于树上任意一个节点,它的两棵子树的高度差不能大于 1。

比如说,给你的二叉树是:

     1
   /   \
  2     4
       / \
      8  16

它的任意节点的左右子树高度差都不大于 1,因此它是一棵平衡二叉树。

再比如说,给你的二叉树是:

     1
   /   \
  2     4
         \
          8
           \
           16

在这棵树中,根节点的左右子树高度差为 2,因此它不是一棵平衡二叉树。比如说,给你的二叉树是:

     1
   /   \
  2     4
       / \
      8  16

它的逆层序遍历结果是:

[
 [8, 16],
 [2, 4],
 [1],
]

代码

public class AlgoCasts {

  public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
      val = x;
    }
  }

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

  // Time: O(nlog(n)), Space: O(n)
  public boolean isBalancedTreeTopDown(TreeNode root) {
    if (root == null) return true;
    return Math.abs(getHeight(root.left) - getHeight(root.right)) <= 1 &&
      isBalancedTreeTopDown(root.left) && isBalancedTreeTopDown(root.right);
  }

  // Time: O(n), Space: O(n)
  public boolean isBalancedTreeBottomUp(TreeNode root) {
    return getHeightAndCheck(root) != -1;
  }

  int getHeightAndCheck(TreeNode root) {
    if (root == null) return 0;

    int left = getHeightAndCheck(root.left);
    if (left == -1) return -1;

    int right = getHeightAndCheck(root.right);
    if (right == -1) return -1;

    if (Math.abs(left - right) > 1) return -1;
    return Math.max(left, right) + 1;
  }

}

  转载请注明: ForwardXu 判断二叉树是否平衡

 上一篇
二叉树前序遍历 二叉树前序遍历
二叉树前序遍历问题 这个题目说的是,给你一个二叉树,你要返回一个数组,表示二叉树前序遍历的结果。 比如说,给你的二叉树是: 1 / \ 2 3 \ 4 / 5 你要返回的前序遍历结果是:
2018-12-28
下一篇 
用前序和中序遍历序列构建二叉树 用前序和中序遍历序列构建二叉树
用前序和中序遍历序列构建二叉树问题 这个题目说的是,给你一棵二叉树的前序和中序遍历序列,你要根据这两个序列构建这棵二叉树。假设这棵二叉树节点上没有重复的数字。 比如说,给你的前序遍历序列和中序遍历序列分别是: 前序遍历序列:1, 2, 4
2018-12-28
  目录