101. 对称二叉树

难度简单

题目

给你一个二叉树的根节点 root检查是否轴对称。

示例 1:

在这里插入图片描述

输入root = [1,2,2,3,4,4,3]
输出true

示例 2:

在这里插入图片描述

输入root = [1,2,2,null,3,null,3]
输出false

提示

**进阶:**你可以运用递归迭代两种方法解决这个问题吗?

个人题解

方法一:递归深度优先遍历

写了 100 题后再写这题,信手捏来。先判断当前节点是否为空。再判断当前节点的左节点和右节点是否相等。再看左左节点与右右节点,再比较左右节点与右左节点。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }
        return process(root.left, root.right);
    }
    public boolean process(TreeNode left, TreeNode right) {
        if (left == null && right == null) {
            return true;
        }
        if (left == null ^ right == null) {
            return false;
        }
        if (left.val != right.val) {
            return false;
        }
        if (!process(left.left, right.right)) {
            return false;
        }
        return process(left.right, right.left);
    }
}

官方题解

方法一:递归

如果一个树的左子树与右子树镜像对称,那么这个树是对称的。因此,该问题可以转化为:两个树在什么情况下互为镜像

如果同时满足下面的条件两个树互为镜像

我们可以实现这样一个递归函数,通过「同步移动两个指针方法来遍历这棵树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q 左移,p 左移时,q 右移。每次检查当前 p 和 q 节点的值是否相等,如果相等再判断左右子树是否对称。

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

    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);
    }
}

复杂度分析

方法二:迭代

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

class Solution {
    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 &amp;&amp; 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;
    }
}

复杂度分析

作者力扣官方题解
链接https://leetcode.cn/problems/symmetrictree/solutions/268109/dui-cheng-er-chashu-by-leetcodesolution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://blog.csdn.net/xxx1276063856/article/details/134701244

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_11839.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注