LeetCode 110:平衡二叉树

平衡二叉树

题目描述:

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

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1: 

输入:root = [3,9,20,null,null,15,7]
输出:true

 示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = [] 
输出:true

链接:

110. 平衡二叉树 - 力扣(LeetCode) (leetcode-cn.com)

解题思路 

这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过 1,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上

思路一:自顶向下的递归

首先计算左右子树的高度,如果左右子树的高度差是否不超过 1,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。这是一个自顶向下的递归的过程。

var isBalanced = function(root) {
  if (root === null) {
      return true;
  }
  return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
};
var height = function (node) {
  if (node === null) return 0;
  return 1 + Math.max(height(node.left), height(node.right))
}

时间复杂度: O(n2),其中 n 是二叉树中的节点个数

最坏情况下,二叉树是满二叉树,需要遍历二叉树中的所有节点,时间复杂度是O(n)。
对于节点 p,如果它的高度是 d,则 height(p) 最多会被调用 d 次(即遍历到它的每一个祖先节点时)。对于平均的情况,一棵树的高度 h 满足 O(h)=O(logn),因为 d≤h,所以总时间复杂度为 O(nlogn)。对于最坏的情况,二叉树形成链式结构,高度为 O(n),此时总时间复杂度为 O(n^2)

空间复杂度: O(n)

思路二:从底至顶(提前阻断)

自底向上递归的做法类似于后序遍历,对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回 −1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。

/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isBalanced = function (root) {
  return height(root) >= 0;
};

var height = function (node) {
  if (node == null) {
    return 0;
  }
  var leftHeight = height(node.left);
  var 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)

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...