二叉树--对称二叉树(leetcode 101

递归

    public boolean check(TreeNode p, TreeNode q){
        if (p == null && q == null){
            return true;
        }
        if (p == null || q == null){
            return false;
        }

        return p.val == q.val && check(p.left, q.right) && check(p.right,q.left);

    }

    public boolean isSymmetric(TreeNode root) {
        return check(root, root);
    }

时空间复杂度都是o(n)


迭代

引入一个队列,这是把递归程序改写成迭代程序的常用方法。初始化时把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。

    public boolean isSymmetric(TreeNode root) {
        if (root == null){
            return true;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode> ();
        queue.offer(root);
        queue.offer(root);

        while (!queue.isEmpty()) {
            TreeNode temp1 = queue.poll();
            TreeNode temp2 = queue.poll();

            if (temp1 == null && temp2 == null){
                continue;
            }

            if ((temp1 == null || temp2 == null) || (temp1.val != temp2.val)){
                return false;
            }

            queue.offer(temp1.left);
            queue.offer(temp2.right);

            queue.offer(temp1.right);
            queue.offer(temp2.left);

        }
        return true;
    }

时空间复杂度都是o(n)

原文地址:https://www.cnblogs.com/swifthao/p/13274575.html