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<Integer> inorderTraversal(TreeNode root) {
        //先画出一棵深度为4的树以帮助理解记忆
        //建立一个栈,将tree.left(1、2、4、8···)压入栈,每次取出
        //将排序好的放入链表中,最后返回链表
        List <Integer> res = new ArrayList<>();
        Stack <TreeNode>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 <TreeNode> stkleft=new Stack<>();
        Stack <TreeNode> 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;
    }   
}

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 更多题目移步【力扣简单题】 题目 难度:★☆☆☆☆类型:二叉树 给定一个二叉树,检查它是否是镜像对称的。 示例 例...
    玖月晴阅读 1,418评论 0 0
  • 对称二叉树 题目 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的...
    饮酒醉回忆阅读 188评论 0 1
  • 101. 对称二叉树 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对...
    one_zheng阅读 275评论 0 0
  • 题目 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 但是下面...
    ___Qian___阅读 711评论 0 1
  • 今天新浪微博推送了很多关于远嫁的博客,让我突然想到了自己和我的发小们。 我没有远嫁,找的婆家离我娘家开车只需要十五...
    狂奔的蜗牛428阅读 251评论 1 4

友情链接更多精彩内容