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;};

如果你有什么新的想法,欢迎在博客评论中一起探讨!👏

上一篇:移动端rem距离单位的使用
下一篇:关于toLocaleString(), toString(), valueOf()方法的使用

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年05月04日 12时29分05秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章