LeetCode 154题:Symmetric Tree

原题目:

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.

解决办法:

第一反应是想中序遍历,比如说Symmetric Tree的中序遍历结果肯定是一个对称的字符串(3241423),显然这个过程是不可逆的,后来想如果还提供树的高度可不可以可逆,画了一下发现是不行,比如说下面这个过程:

    1                                                        1
   / \                                                      / \
  2   2         ==>        32123         ==>               3   2
 /     \                                                    \   \
3       3                                                    2   3

还是老老实实递归好了,代码如下:

/**
 * 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(null == root)
            return true;
        return isSymmetric(root.left, root.right);
    }
    
    private boolean isSymmetric(TreeNode leftOne, TreeNode rightOne) {
        if(leftOne == null && rightOne == null)
            return true;
        if((leftOne == null && rightOne != null) || (leftOne != null && rightOne == null))
            return false;
        return isSymmetric(leftOne.left, rightOne.right) && isSymmetric(leftOne.right, rightOne.left) && leftOne.val == rightOne.val; 
    }
}

既然递归实现了,那么循环加栈就简单了:

/**
 * 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(null == root)
            return true;
        if(root.left == null || root.right == null)
            return root.left == null && root.right == null;
        Stack treeNodes = new Stack();
        treeNodes.push(root.left);
        treeNodes.push(root.right);
        while(treeNodes.size() > 0) {
            TreeNode right = treeNodes.pop();
            TreeNode left = treeNodes.pop();
            if((left == null && right != null) || (left != null && right == null))
                return false;
            if(left != null && right != null) {
                if(left.val != right.val)
                    return false;
                treeNodes.push(left.left);
                treeNodes.push(right.right);
                treeNodes.push(left.right);
                treeNodes.push(right.left);
            }
        }
        return true;
    }
}


你可能感兴趣的:(LeeCode,JAVA,leetcode)