
LeetCode 对称二叉树
发布日期:2021-05-13 01:00:20
浏览次数:14
分类:博客文章
本文共 1623 字,大约阅读时间需要 5 分钟。
此题是我在最近学习力扣卡片时候遇到了,当时采取了一种比较笨的方法,最后的结果是超时,于是又想了一下,最终使用递归和迭代两种方法来解决问题。
题目描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1 / \ 2 2 / \ / \3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1 / \ 2 2 \ \ 3 3
解题思路
这个大家应该能想出来怎么比较,首先,判断树是否为空,为空的话自然就是对称的,然后再取根节点的左右节点进行判空和判断是否相等的操作。
如果说一个节点从根节点出来的走向是:左-->右-->右-->左,那么与他对应的界面的走向应该是:右-->左-->左-->右,有了这个逻辑,我们之后写递归和迭代的时候就有思路了。
实现代码
代码是使用JavaScript写的,生成的树的结构是这个样子的
{ val:1, left:{ val:2, left: null, right: null }, right:null}
根据上一步的分析,大家应该可以看明白代码是怎么实现的。
递归
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } *//** * @param {TreeNode} root * @return {boolean} */var isSymmetric = function(root) { function isBothSymmetric(left, right){ if(!left && !right){ return true; } if(!left || !right){ return false; } return (left.val==right.val) && isBothSymmetric(left.left, right.right) && isBothSymmetric(left.right, right.left); } if(!root){ return true; } return isBothSymmetric(root.left, root.right);};
迭代
var isSymmetric = function(root) { if(!root){ return true; } let stack = []; stack.push(root.left, root.right); while(stack.length!=0){ let r = stack.pop(); let l = stack.pop(); if(!l && !r){ continue; } if((!l && r) || (l &&!r)){ return false; } if(l.val != r.val){ return false; } stack.push(l.left, r.right, l.right, r.left); } return true;};
如果你有什么新的想法,欢迎在博客评论中一起探讨!👏
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年05月04日 12时29分05秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
3、条件查询
2019-03-11
5、分组函数 / 聚合函数
2019-03-11
8、子查询
2019-03-11
cordova打包apk更改图标
2019-03-11
开启与配置SMTP服务器
2019-03-11
域名解析步骤
2019-03-11
APP卡片式设计
2019-03-11
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2019-03-11
云数据库
2019-03-11
图计算
2019-03-11
大数据在不同领域的应用
2019-03-11
页面置换算法
2019-03-11
推荐系统资料
2019-03-11
文件系统的层次结构
2019-03-11
减少磁盘延迟时间的方法
2019-03-11
vue(渐进式前端框架)
2019-03-11
权值初始化和与损失函数
2019-03-11
案例讨论
2019-03-11
传输层基本功能
2019-03-11
问题的计算复杂度:排序问题
2019-03-11