Leetcode-Symmetric Tree

LiBlog發表於2014-11-09

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

Iterative solution:
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root==null) return true;

        List<TreeNode> left = new LinkedList<TreeNode>();
        List<TreeNode> right = new LinkedList<TreeNode>();
        List<Integer> state = new LinkedList<Integer>();
        left.add(root.left);
        right.add(root.right);
        state.add(0);
        int level = 0;
        while (level>=0){
            int curState = state.get(level);
            TreeNode node1 = left.get(level);
            TreeNode node2 = right.get(level);

            //Newly enqueue
            if (curState == 0){
                if (node1==null && node2==null){
                    state.remove(level);
                    left.remove(level);
                    right.remove(level);
                    level--;
                    continue;
                }
                if (node1==null && node2!=null) return false;
                if (node1!=null && node2==null) return false;
                if (node1.val!=node2.val) return false;
                //Check node1.left && node2.right. change state.
                state.set(level,1);
                left.add(node1.left);
                right.add(node2.right);
                state.add(0);
                level++;
                continue;
            }
            //Check node1.right && node2.leflt, change state.
            if (curState==1){
                state.set(level,2);
                left.add(node1.right);
                right.add(node2.left);
                state.add(0);
                level++;
                continue;
            }

            //Already checked left and right subtree, backtrack.
            state.remove(level);
            left.remove(level);
            right.remove(level);
            level--;
        }
        return true;
    }
}

 


Solution:
 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Solution {
11     public boolean isSymmetric(TreeNode root) {
12         if (root==null)
13             return true;
14         
15         boolean res = isSymmetricRecur(root.left,root.right);
16         
17         return res;
18     }
19     
20     //Determine whether the tree "left" and the tree "right" is symmetric.
21     public boolean isSymmetricRecur(TreeNode left, TreeNode right){
22         //One is null, the other is not, then false;
23         if ((left==null && right!=null)||(left!=null&&right==null))
24             return false;
25             
26         //Both are empty, then true;
27         if (left==null&&right==null)
28             return true;
29         
30         //Both are not empty, but val is not the same, then false.
31         if (left.val!=right.val)
32             return false;
33         
34         //Both of them are leaf nodes
35         if (left.left==null&&left.right==null&&right.left==null&&right.right==null)
36             if (left.val==right.val)
37                 return true;
38             else 
39                 return false;
40         
41         boolean leftSym = isSymmetricRecur(left.left,right.right);
42         if (!leftSym)
43             return false;
44             
45         boolean rightSym = isSymmetricRecur(left.right,right.left);
46         if (!rightSym)
47             return false;
48             
49             
50         return true;
51     }
52 }

This is an recursion solution. For easy solution, we can use BFS to put every node into a list orderred by level, then check whether the nodes on the same level are symmetric.

NOTE: we need consider all situation carefully. I failed several times because of missing some situations!

相關文章