Loading

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

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

posted @ 2019-08-16 23:50  Jacob是我了  阅读(153)  评论(0编辑  收藏  举报