一天一大 lee(平衡二叉树)难度:简单-Day20200817

时间:2022-07-25
本文章向大家介绍一天一大 lee(平衡二叉树)难度:简单-Day20200817,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目:[1]

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

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

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

示例

  1. 示例 1 给定二叉树 [3,9,20,null,null,15,7]
    3
   / 
  9  20
    /  
   15   7

返回 false

  1. 示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4]
       1
      / 
     2   2
    / 
   3   3
  / 
 4   4

返回 false

抛砖引玉

抛砖引玉

二叉树遍历,递归

  • 参数,要检查是否平衡的节点
  • 返回:
    • 为空,返回 true
    • 不为空,需要判断左右节点的子节点是否平衡且子节点高度差值是否<=1

自顶向下的递归

从根节点递归 逐个节点计算其子节点高度

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isBalanced = function (root) {
  if (!root) return true
  return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);

  // 计算传入节点的高度 => 左子节点+右子节点高度
  function height(node) {
    if (!node) return 0
    return Math.max(height(node.left), height(node.right))+1
  }
}

自底向上的递归

  • 逐层计算子节点左右子节点的高度数时直接判断该子节点是否平衡,如果不平衡则整个二叉树都不可能是平衡二叉树
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isBalanced = function (root) {
  return height(root) >= 0;

  function height(node) {
    if (!node) return 0
    let left = height(node.left),
        right = height(node.right);
    // 存在左右节点高度差值大于1的节点,则整个二叉树都不可能是平衡二叉树
    if (left === -1 || right === -1 || Math.abs(left - right) > 1) {
      return -1;
    } else {
      // 如果节点平衡返回节点高度
      return Math.max(left, right) + 1;
    }
  }
}

[1]

题目:: https://leetcode-cn.com/problems/balanced-binary-tree/