美文网首页
Symmetric Tree

Symmetric Tree

作者: sherrysack | 来源:发表于2018-05-28 12:00 被阅读0次

    Symmetric Tree

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

    For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

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

    But the following [1,2,2,null,3,null,3] is not:

        1
       / \
      2   2
       \   \
       3    3
    
    

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

    Thoughts: Waste a lot of time trying solving this problem as "judging the tree is balanced or not". Stupid!

    Only the top-down solution applies to this problem. Think about how you usually know whether a tree is symmetric. The procedure naturally leads to recursive solution.

    Recursive Solution

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isSymmetric(TreeNode root) {
            return root == null || finddiff(root.left, root.right);
        }
    
        public boolean finddiff(TreeNode left, TreeNode right) {
            if(left == null && right == null) {
                return true;
            }
            if(left== null || right == null) {
                return false;
            }
            if(left.val != right.val) {
                return false;
            }else {
                return finddiff(left.left, right.right) && finddiff(right.left, left.right);
            }
        }
    }
    

    Non Recursive solution

    public boolean isSymmetric(TreeNode root) {
        if(root==null)  return true;
        
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode left, right;
        if(root.left!=null){
            if(root.right==null) return false;
          //if not, then root has both left child and right child, push their values and wait for judgment
            stack.push(root.left);
            stack.push(root.right);
        }
        else if(root.right!=null){
            return false;
        }
            
        while(!stack.empty()){
          //judge whether the left child equals to right child
            if(stack.size()%2!=0)   return false;
            right = stack.pop();
            left = stack.pop();
            if(right.val!=left.val) return false;
            //if the left child has left child
            if(left.left!=null){
              //if the right child doesn't have right child, then the tree is not balanced
                if(right.right==null)   return false;
                stack.push(left.left);
                stack.push(right.right);
            }
            else if(right.right!=null){
                return false;
            }
                
            if(left.right!=null){
                if(right.left==null)   return false;
                stack.push(left.right);
                stack.push(right.left);
            }
            else if(right.left!=null){
                return false;
            }
        }
        
        return true;
    }
    

    相关文章

      网友评论

          本文标题:Symmetric Tree

          本文链接:https://www.haomeiwen.com/subject/qjowjftx.html