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/ 处获得。


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

查看所有标签

猜你喜欢:

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

驯服烂代码

驯服烂代码

伍斌 / 机械工业出版社 / 2014-11 / 69.00

Kent Beck、Martin Fowler、Michael C. Feathers、Robert C. Martin、Joshua Kerievsky、Gerard Meszaros等大师们的传世著作为如何提升编程技艺和代码质量提供了思想和原则上的指导,本书则为实践和融合这些思想、原则提供了过程和方法上指导。本书通过编程操练的方式讲述了如何用TDD(测试驱动开发)的方法来驯服烂代码,通过结对编......一起来看看 《驯服烂代码》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换