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

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

内容简介: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/ 处获得。


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

查看所有标签

猜你喜欢:

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

Essential C++中文版

Essential C++中文版

[美] Stanley B. Lippman / 侯捷 / 华中科技大学出版社 / 2001-8 / 39.80元

书中以4个面向来表现C++的本质:procedural(程序性的)、generic(泛型的)、object-based(个别对象的)、object-oriented(面向对象的),全书围绕着一系列逐渐繁复的程序问题,以及用以解决这些问题的语言特性。循此方式,读者不只学到C++的函数和结构,也会学习到它们的设计目的和基本原理。一起来看看 《Essential C++中文版》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具