LeetCode - 100 - 相同的树(same-tree)

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

内容简介:LeetCode - 100 - 相同的树(same-tree)

Create by jsliang on 2019-6-13 07:36:52
Recently revised in 2019-6-13 08:56:03

一 目录

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

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 - 二叉树 | | 四 执行测试 | | 五 LeetCode Submit | | 六 解题思路 | | 七 进一步思考 |

二 前言

  • 难度:简单

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

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

  • 题目内容

  1. 给定两个二叉树,编写一个函数来检验它们是否相同。

  2. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

  3. 示例 1:

  4. 输入: 1 1

  5. / \ / \

  6. 2 3 2 3

  7. [1,2,3], [1,2,3]

  8. 输出: true

  9. 示例 2:

  10. 输入: 1 1

  11. / \

  12. 2 2

  13. [1,2], [1,null,2]

  14. 输出: false

  15. 示例 3:

  16. 输入: 1 1

  17. / \ / \

  18. 2 1 1 2

  19. [1,2,1], [1,1,2]

  20. 输出: false

三 解题 - 二叉树

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

  1. var isSameTree = function(p, q) {

  2. let serialize = function(root) {

  3. if (!root) {

  4. return '#!';

  5. }

  6. return `${root.val}!${serialize(root.left)}${serialize(root.right)}`;

  7. };

  8. return serialize(p) === serialize(q);

  9. };

四 执行测试

  • 参数 p、 q

  1. var p = {

  2. val: 1,

  3. left: {

  4. val: 2,

  5. left: null,

  6. right: null,

  7. },

  8. right: {

  9. val: 1,

  10. left: null,

  11. right: null,

  12. },

  13. }

  14. var q = {

  15. val: 1,

  16. left: {

  17. val: 1,

  18. left: null,

  19. right: null,

  20. },

  21. right: {

  22. val: 2,

  23. left: null,

  24. right: null,

  25. },

  26. }

  • 返回值 return

  1. false

五 LeetCode Submit

  1. Accepted

  2. 57/57 cases passed (76 ms)

  3. Your runtime beats 91.4 % of javascript submissions

  4. Your memory usage beats 23.48 % of javascript submissions (33.7 MB)

六 解题思路

首先jsliang 和小伙伴们一样,都是首次接触二叉树,未免有点懵逼。

前端大佬除外,懂二叉树的除外~

然后jsliang 进行了下打印,查看下为何如此解题:

  1. var isSameTree = function(p, q) {

  2. console.log('------\n原树:');

  3. console.log(p);

  4. console.log(q);

  5. let serialize = function(root) {

  6. if (!root) {

  7. return '#!';

  8. }

  9. return `${root.val}!${serialize(root.left)}${serialize(root.right)}`;

  10. };

  11. console.log('------\n现字符串:');

  12. console.log(serialize(p));

  13. console.log(serialize(q));

  14. return serialize(p) === serialize(q);

  15. };

  1. ------

  2. 原树:

  3. { val: 1,

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

  5. right: { val: 1, left: null, right: null } }

  6. { val: 1,

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

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

  9. ------

  10. 现字符串:

  11. 1!2!#!#!1!#!#!

  12. 1!1!#!#!2!#!#!

  13. false

最后,看到这里,jsliang 感觉自己思路打开了大门,好像,二叉树的比较并不复杂嘛!(当然,仅限于比较,哈哈)

可以看到的是,我们通过递归,让树节点不断前行,就好比递归到 p 的最后一个节点 right:{val:1,left:null,right:null},这时候,我们通过

  1. let serialize = function(root) {

  2. if (!root) {

  3. return '#!';

  4. }

  5. return `${root.val}!${serialize(root.left)}${serialize(root.right)}`;

  6. };

来判断一个节点,是否还有子节点,到这最后一个节点的时候,因为 root.leftroot.right 都是 null,所以触发 if(!root){...} 的条件,返回 #!(当然,这个不是固定的,你可以替换成其他字符串)。

那么,执行完这句,返回的就是 1!#!#!,再回看其他的节点,就一目明了了!

七 进一步思考

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

jsliang 每次解 LeetCode,都会先自己尝试破解,Submit 通过后,会查看下 LeetCode 社区其他小伙伴的破解思路,最后再看别人的代码,以此作为比较,吸取大神们的经验。

这次,由于第一次解树的题目,所以抱着虚心的心态,前往观摩,还真碰到了个不错的讲解:

  • 写树算法的套路框架

由于原文采用 C++ 的编程风格,jsliang 引入的时候自动转换成 JavaScript。

以下是其内容:


二叉树算法的设计的总路线:明确一个节点要做的事情,然后剩下的事抛给框架。

  1. let traverse = function(root) {

  2. // root 需要做什么?在这做。

  3. // 其他的不用 root 操心,抛给框架

  4. traverse(root.left);

  5. traverse(root.right);

  6. }

举两个简单的例子体会一下这个思路,热热身。

  • 如何把二叉树所有的节点中的值加一?

  1. let plusOne = function(root) {

  2. if (!root) {

  3. return;

  4. }

  5. root.val += 1;

  6. plusOne(root.left);

  7. plusOne(root.right);

  8. }

  • 如何判断两棵二叉树是否完全相同?

  1. let isSameTree = function(root1, root2) {

  2. // 都为空的话,显然相同

  3. if (root1 == null && root2 == null) {

  4. return true;

  5. }

  6. // 一个为空,一个非空,显然不同

  7. if (root1 == null || root2 == null) {

  8. return false;

  9. }

  10. // 两个都非空,但 val 不一样也不行

  11. if (root1.val != root2.val) {

  12. return false;

  13. }

  14. // root1 和 root2 该比的都比完了,进行节点比较

  15. return isSameTree(root1.left, root2.left) && isSameTree(root1.right, root2.right);

  16. }


大佬的解题套路如上,jsliang 觉得貌似有点道理,于是给记录下来,如果下次再碰到树,还能引用套路,无疑是件可喜的事!


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

LeetCode - 100 - 相同的树(same-tree)

jsliang 会每天在公众号发表一篇文章,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构等等。

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

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

Beautiful Code

Beautiful Code

Greg Wilson、Andy Oram / O'Reilly Media / 2007-7-6 / GBP 35.99

In this unique work, leading computer scientists discuss how they found unusual, carefully designed solutions to difficult problems. This book lets the reader look over the shoulder of major coding an......一起来看看 《Beautiful Code》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

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

在线XML、JSON转换工具