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

栏目: IT技术 · 发布时间: 6年前

内容简介:LeetCode -110 - 平衡二叉树(balanced-binary-tree)

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

一 目录

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

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

二 前言

  • 难度:简单

  • 涉及知识:树、深度优先搜索

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

  • 题目内容

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

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

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

  4. 示例 1:

  5. 给定二叉树 [3,9,20,null,null,15,7]

  6. 3

  7. / \

  8. 9 20

  9. / \

  10. 15 7

  11. 返回 true

  12. 示例 2:

  13. 给定二叉树 [1,2,2,3,3,null,null,4,4]

  14. 1

  15. / \

  16. 2 2

  17. / \

  18. 3 3

  19. / \

  20. 4 4

  21. 返回 false

三 解题

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

  • 解题代码

  1. var isBalanced = function(root) {

  2. let ergodic = function(root) {

  3. if (!root) {

  4. return 0;

  5. }

  6. let left = ergodic(root.left);

  7. if (left === -1) {

  8. return -1;

  9. }

  10. let right = ergodic(root.right);

  11. if (right === -1) {

  12. return -1;

  13. }

  14. return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;

  15. }

  16. return ergodic(root) !== -1;

  17. };

四 执行测试

  • root

  1. // 3

  2. // / \

  3. // 9 20

  4. // / \

  5. // 15 7

  6. let root = {

  7. val: 3,

  8. left: { val: 9, left: null, right: null },

  9. right: {

  10. val: 20,

  11. left: { val: 15, left: null, right: null },

  12. right: { val: 7, left: null, right: null },

  13. },

  14. }

  • return

  1. true

  • LeetCode Submit

  1. Accepted

  2. 227/227 cases passed (88 ms)

  3. Your runtime beats 98.58 % of javascript submissions

  4. Your memory usage beats 31.68 % of javascript submissions (37.7 MB)

五 知识点

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

六 解题思路

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

案例 1 - 不符合平衡二叉树

  1. 3

  2. / \

  3. 9 20

  4. \

  5. 7

  6. \

  7. 2

案例 2 - 不符合平衡二叉树

  1. 3

  2. / \

  3. 9 20

  4. / \

  5. 3 7

  6. \

  7. 2

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

以案例 2 为参考

  1. let root = {

  2. val: 3,

  3. left: { val: 9, left: null, right: null },

  4. right: {

  5. val: 20,

  6. left: { val: 3, left: null, right: null },

  7. right: {

  8. val: 7,

  9. left: null,

  10. right: { val: 2, left: null, right: null },

  11. },

  12. },

  13. }

  14. var isBalanced = function(root) {

  15. let ergodic = function(root) {

  16. if (!root) {

  17. return 0;

  18. }

  19. let left = ergodic(root.left);

  20. if (left === -1) {

  21. return -1;

  22. }

  23. let right = ergodic(root.right);

  24. if (right === -1) {

  25. return -1;

  26. }

  27. console.log('------');

  28. console.log(left, right);

  29. console.log(root);

  30. return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;

  31. }

  32. return ergodic(root) != -1;

  33. };

  34. console.log(isBalanced(root));

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

  1. ------

  2. 0 0

  3. { val: 9, left: null, right: null }

  4. ------

  5. 0 0

  6. { val: 3, left: null, right: null }

  7. ------

  8. 0 0

  9. { val: 2, left: null, right: null }

  10. ------

  11. 0 1

  12. { val: 7,

  13. left: null,

  14. right: { val: 2, left: null, right: null } }

  15. ------

  16. 1 2

  17. { val: 20,

  18. left: { val: 3, left: null, right: null },

  19. right:

  20. { val: 7,

  21. left: null,

  22. right: { val: 2, left: null, right: null } } }

  23. ------

  24. 1 3

  25. { val: 3,

  26. left: { val: 9, left: null, right: null },

  27. right:

  28. { val: 20,

  29. left: { val: 3, left: null, right: null },

  30. right: { val: 7, left: null, right: [Object] } } }

  31. false

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

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

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

七 进一步思考

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

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

  1. const obj = {

  2. val: 1,

  3. next: {

  4. val: 2,

  5. next: {

  6. val: 3,

  7. next: {

  8. val: null,

  9. }

  10. }

  11. }

  12. }

  13. // 1 -> 2 -> 3 -> null

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

  1. let regodic = function(obj) {

  2. if (!obj.next) return '!#';

  3. return '!' + obj.val + regodic(obj.next);

  4. }

  5. console.log(regodic(obj));

那么它会输出什么呢?

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

是的,最底层返回 !#

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

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

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

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


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

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

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

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

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTTP Essentials

HTTP Essentials

Stephen A. Thomas、Stephen Thomas / Wiley / 2001-03-08 / USD 34.99

The first complete reference guide to the essential Web protocol As applications and services converge and Web technologies not only assume HTTP but require developers to manipulate it, it is be......一起来看看 《HTTP Essentials》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具