101.对称二叉树

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

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


image.png

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


image.png

法一:递归调用

class Solution {
    public boolean isSymmetric(TreeNode root) {
        //递归
        if(root==null)
            return true;
        //空节点是特殊二叉树
        return dfs(root.left,root.right);
    }
    public boolean dfs(TreeNode p,TreeNode q){
        //当有一个为空,另一个必须也为空
        if(p==null || q==null)
            return (p==null)&&(q==null);
        //左边往左走右边就得往右走以求对称
        //一旦有一点不对称立即返回false
        return p.val==q.val && dfs(p.left,q.right) && dfs(p.right,q.left);
    }
}

法二:迭代法
(利用94题的中序遍历【LDR】的步骤,左边一样,右边反着来)
(94题是开一个栈,将tree.left的结点(1、2、4、8)压入栈,等right遍历完就pop)
先放一个94题的代码

class Solution {
    public List inorderTraversal(TreeNode root) {
        //先画出一棵深度为4的树以帮助理解记忆
        //建立一个栈,将tree.left(1、2、4、8···)压入栈,每次取出
        //将排序好的放入链表中,最后返回链表
        List  res = new ArrayList<>();
        Stack stack=new Stack<>();
        TreeNode p=root;
        while(p!=null || !stack.isEmpty()){
            while(p!=null){
                stack.push(p);
                p=p.left;
            }
            p=stack.pop();
            res.add(p.val);
            p=p.right;
        }
        return res;
    }
}

接下来回归正题101
这次要建立两个栈分别用来存左边和右边的节点

class Solution {
    public boolean isSymmetric(TreeNode root) {
        //递归
        if(root==null)
            return true;
        Stack  stkleft=new Stack<>();
        Stack  stkright=new Stack<>();
        TreeNode l=root.left, r=root.right;
        while(l!=null || r!=null || !stkleft.empty() || !stkright.empty()){
            while( (l!=null) && (r!=null) ){
                stkleft.push(l);
                stkright.push(r);
                l=l.left;
                r=r.right;
            }
            //结束循环之后一个空一个不空就返回false
            if(l!=null || r!=null)
                return false;
            //成功的话要给l和r赋值,并把使用过的点pop出来
            l=stkleft.pop();
            
            r=stkright.pop();
            
            if(l.val!=r.val)
                return false;
            //否则的话,把l的左子树加进来,r的右子树加进来
            l=l.right;
            r=r.left;
        }
        return true;
    }   
}

迭代还可以用队列的方法······

你可能感兴趣的:(101.对称二叉树)