101. Symmetric Tree

来源:互联网 发布:善领dsa p57数据升级包 编辑:程序博客网 时间:2024/06/04 18:50

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.

对比left.left, right.right && left.right, right.left,如果val相等,继续递归。注意以下几点:

1、如果root==null,返回true

2、如果left或者right等于null,不能访问其左右节点和val,否则会outstack,所以要先判断left或者right等不等于null

代码如下:

/** * 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) {        if (root == null) {            return true;        }        return helper(root.left, root.right);    }    public boolean helper(TreeNode left, TreeNode right) {        /*if (left == null && right == null) {            return true;        }        if (left == null || right == null) {            return false;        }*/        //above lines can simplify as following        if (left == null || right == null) {            return left == right;        }         if (left.val != right.val) {            return false;        }        return helper(left.left, right.right) && helper(left.right, right.left);    }}

Non-recursive(use Stack)--460ms:

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;        stack.push(root.left);        stack.push(root.right);    }    else if(root.right!=null){        return false;    }            while(!stack.empty()){        if(stack.size()%2!=0)   return false;        right = stack.pop();        left = stack.pop();        if(right.val!=left.val) return false;                if(left.left!=null){            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;}

0 0
原创粉丝点击