欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

递归 & 迭代,解力扣101.对称二叉树

程序员文章站 2022-05-16 14:59:38
...

递归 & 迭代,解力扣101.对称二叉树

紧跟上一篇,继续理解递归与迭代。

递归解法

思路:
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。
如果同时满足下面的条件,两个树互为镜像:
它们的两个根结点具有相同的值
每个树的右子树都与另一个树的左子树镜像对称


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 
public boolean isSymmetric(TreeNode root) {
    return isMirror(root,root);
}
public boolean isMirror(TreeNode t1, TreeNode t2){
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
return (t1.val == t2.val)
    && isMirror(t1.right, t2.left)//递归依次输入要比较的位置
    && isMirror(t1.left, t2.right);
}

时间复杂度O(N),依次遍历整棵树。

迭代形式

思路:
引入一个队列,这是把递归程序改写成迭代程序的常用方法。
初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值,然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称时,该算法结束。

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

    public boolean check(TreeNode u, TreeNode v) {
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.offer(u);
        q.offer(v);
        while (!q.isEmpty()) {
            u = q.poll();
            v = q.poll();
            if (u == null && v == null) {
                continue;
            }
            if ((u == null || v == null) || (u.val != v.val)) {
                return false;
            }

            q.offer(u.left);
            q.offer(v.right);

            q.offer(u.right);
            q.offer(v.left);
        }
        return true;
    }

时间复杂度O(N)

相关标签: 算法