110 - 平衡二叉树(balanced-binary-tree)

Create by jsliang on 2019-6-24 07:48:53
Recently revised in 2019-6-24 21:42:26

一 目录

不折腾的前端,和咸鱼有什么区别

目录
一 目录
二 前言
三 解题
四 执行测试
五 知识点
六 解题思路
七 进一步思考

二 前言

返回目录

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

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

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过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 。

三 解题

返回目录

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

  • 解题代码
var isBalanced = function(root) {
  let ergodic = function(root) {
    if (!root) {
      return 0;
    }
    let left = ergodic(root.left);
    if (left === -1) {
      return -1;
    }
    let right = ergodic(root.right);
    if (right === -1) {
      return -1;
    }
    return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
  }
  return ergodic(root) !== -1;
};

四 执行测试

返回目录

  • root
//   3
//  / \
// 9  20
//   /  \
//  15   7
let root = {
  val: 3,
  left: { val: 9, left: null, right: null },
  right: {
    val: 20,
    left: { val: 15, left: null, right: null },
    right: { val: 7, left: null, right: null },
  },
}
  • return
true
  • LeetCode Submit
√ Accepted
  √ 227/227 cases passed (88 ms)
  √ Your runtime beats 98.58 % of javascript submissions
  √ Your memory usage beats 31.68 % of javascript submissions (37.7 MB)

五 知识点

返回目录

Math:JS 中的内置对象,具有数学常数和函数的属性和方法。Math 详细介绍

六 解题思路

返回目录

首先,我们需要明白题意,怎样的树不符合平衡二叉树呢?

案例 1

  3
 / \
9  20
     \
      7
       \
        2

案例 2

  3
 / \
9  20
  /  \
 3    7
       \
        2

然后,我们查看下它遍历情况,它为什么不符合我们的要求了?

以案例 2 为参考

let root = {
  val: 3,
  left: { val: 9, left: null, right: null },
  right: {
    val: 20,
    left: { val: 3, left: null, right: null },
    right: {
      val: 7,
      left: null,
      right: { val: 2, left: null, right: null },
    },
  },
}

var isBalanced = function(root) {
  let ergodic = function(root) {
    if (!root) {
      return 0;
    }
    let left = ergodic(root.left);
    if (left === -1) {
      return -1;
    }
    let right = ergodic(root.right);
    if (right === -1) {
      return -1;
    }
    console.log('------');
    console.log(left, right);
    console.log(root);
    return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
  }
  return ergodic(root) != -1;
};

console.log(isBalanced(root));

小伙伴们可以猜测下打印结果:

------
0 0
{ val: 9, left: null, right: null }
------
0 0
{ val: 3, left: null, right: null }
------
0 0
{ val: 2, left: null, right: null }
------
0 1
{ val: 7,
  left: null,
  right: { val: 2, left: null, right: null } }
------
1 2
{ val: 20,
  left: { val: 3, left: null, right: null },
  right:
   { val: 7,
     left: null,
     right: { val: 2, left: null, right: null } } }
------
1 3
{ val: 3,
  left: { val: 9, left: null, right: null },
  right:
   { val: 20,
     left: { val: 3, left: null, right: null },
     right: { val: 7, left: null, right: [Object] } } }
false

在这里,由于我们是以递归的形式,所以,我们会先遍历左节点,再遍历右节点,最后再遍历根节点(后序遍历)

同时,我们判断左右树的高度差是否超过 1,如果是,则进行中断,返回 false;否则,继续递归。

最后,我们将遍历的结果与 -1 进行比较,返回 true 或者 false

七 进一步思考

返回目录

这里给基础教弱的同学补个知识点:递归

我们结合题意来讲,假设我们有一个对象:

const obj = {
  val: 1,
  next: {
    val: 2,
    next: {
      val: 3,
      next: {
        val: null,
      }
    }
  }
}

// 1 -> 2 -> 3 -> null

我们需要遍历这个链表的所有节点,我们会怎么做呢?

let regodic = function(obj) {
  if (!obj.next) return '!#';
  return '!' + obj.val + regodic(obj.next);
}
console.log(regodic(obj));

那么它会输出什么呢?

答案是:!1!2!3!#

是的,最底层返回 !#

然后递归上一层,变成 !3!#

再上一层,变成 !2!3!#

再再上一层,得到最终答案,变成 !1!2!3!#

那么,讲到这里,小伙伴们再回顾这道题,应该知道为什么 leftright 的值会按照我们想法行事的了。


不折腾的前端,和咸鱼有什么区别!

图

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

知识共享许可协议
jsliang 的文档库梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。

Copyright © jsliang.top 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-06-24 21:42:27

results matching ""

    No results matching ""