【LeetCode】Symmetric Tree 解题报告

Symmetric Tree 解题报告

[LeetCode]

https://leetcode.com/problems/symmetric-tree/

Total Accepted: 106639 Total Submissions: 313969 Difficulty: Easy

Question

Given a binary tree, check whether it is a mirror of itself (ie,
symmetric around its center).

For example, this binary tree is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

But the following is not:

    1
   / \
  2   2
   \   \
   3    3

Note: Bonus points if you could solve it both recursively and
iteratively.

Ways

题目的意思是判断一个树是否为对称的树。

又到了智商捉急的时候了。本以为要用广度优先遍历,然后用队列还有元素染色的方式去做。但是最基本的递归调用都不会了吗?

方法一

递归。

参考了LeetCode官方解答,递归的方法实现比较左右子树的左右子树是否对称。

不过确实可以提醒我一点,就是说,一个二叉树遍历的过程中不一定一定只有一个参数,也可以同时传了两个参数分别是左右好处是可以直接比较,当然这个时候需要把root放到两个参数上进行比较。

本来也不是一个很难得题目,需要自己更多的掌握技巧,另外,不要把事情想复杂。

递归很重要的一部分是终止条件的确定。这个一定要认真的去写。

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
        return isMirror(root,root);
    }

    public boolean isMirror(TreeNode left,TreeNode right){
        if(left == null && right == null)   return true;
        if(left == null || right == null)   return false;
        return (left.val == right.val) && isMirror(left.left,right.right) && isMirror(left.right,right.left);
    }
}

AC:1ms

方法二

循环。

这个确实是用到了一个队列和两个节点的方式,勉强算是广度优先的搜索。原理和方法一是一样的。不再赘述。

需要注意一个,就是当left==null && right==null的时候并不是和方法一一样进行返回是 true,因为方法一是递归,递归的一个结束并不代表所有都结束,两个都为空代表这两个子树是相同的,所以返回true.而循环需要把所有的节点都遍历完才能确定返回结果,除非提前遇到不同的节点值而终止,所以是continue;

另外这个方法最后的return true就是对上面这个的补充,以为没有提前终止一直到最后都比较了,所以说明是镜像的。

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        q.add(root);
        while(!q.isEmpty()){
            TreeNode left=q.poll();
            TreeNode right=q.poll();
            if(left==null && right==null)   continue;
            if(left==null || right==null)   return false;
            if(left.val != right.val)   return false;
            q.add(left.left);
            q.add(right.right);
            q.add(left.right);
            q.add(right.left);
        }
        return true;
    }

}

AC:3ms

Date

2016 年 05月 8日

你可能感兴趣的:(LeetCode)