leetcode101.对称二叉树(JAVA 递归与非递归)

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

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

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

   1
   / \
  2   2
   \   \
   3    3

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

  • 解法一;递归
	class Solution {
	    public boolean isSymmetric(TreeNode root) {
	        //递归版本
	        if(root==null) return true;
	        return isSymmetric(root.left,root.right);
	    }
	     public boolean isSymmetric(TreeNode root1,TreeNode root2){
	         //都为空
	         if(root1 == null && root2 == null)
	            return true;
	        if(root1 == null||root2 == null)//有一个为NULL
	            return false;
	         //如果两个不为空,比较值大小
	         if(root1.val!=root2.val)        return false;
	         return isSymmetric(root1.left,root2.right)&&isSymmetric(root1.right,root2.left);
	     }
	}

解法二;非递归

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null) return true;
        Stack<TreeNode> s1 =  new Stack<TreeNode>();
        Stack<TreeNode> s2 =  new Stack<TreeNode>();
        TreeNode l = root.left;
        TreeNode r = root.right;
        while(l!=null || r!=null || s1.size()>0 || s2.size()>0){
            while(l!=null&&r!=null){//当l r 同时存在
                s1.push(l);l=l.left;
                s2.push(r);r=r.right;
            }
            if(l!=null||r!=null) return false;
            //此时l 和 r 都为空
            l = s1.pop();
            r = s2.pop();
            if(l.val!=r.val) return false;
            l = l.right;
            r = r.left;
        }
        return true;
    }
}
点赞