LeetCode 对称二叉树
此题是我在最近学习力扣卡片时候遇到了,当时采取了一种比较笨的方法,最后的结果是超时,于是又想了一下,最终使用递归和迭代两种方法来解决问题。
题目描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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;
};
如果你有什么新的想法,欢迎在博客评论中一起探讨!👏
我不管,JS天下第一