美文网首页
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