【力扣题解】P101-对称二叉树-Java题解

花无缺

‍博客主页:@花无缺
欢迎 点赞 收藏⭐ 留言 加关注✅!
本文由 花无缺 原创

收录于专栏 【力扣题解】


文章目录

  • 【力扣题解】P101-对称二叉树-Java题解
    • 题目描述
    • 题解
    • 总结


【力扣题解】P101-对称二叉树-Java题解

P101.对称二叉树

题目描述

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

示例 1:

【力扣题解】P101-对称二叉树-Java题解_第1张图片

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

示例 2:

【力扣题解】P101-对称二叉树-Java题解_第2张图片

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

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

题解

递归法

public boolean isSymmetric(TreeNode root) {
    return recur(root.left, root.right);
}
// 深度优先搜索, 递归法
// 递归终止条件:
// 1.两个节点都为空
// 2.仅有一个节点为空
// 3.两个节点的值不相等
public boolean recur(TreeNode L, TreeNode R) {
    // 两个节点都为空
    if (L == null && R == null) {
        return true;
    }
    // 仅有一个节点为空
    if (L == null || R == null) {
        return false;
    }
    // 两个节点的值不相等
    if (L.val != R.val) {
        return false;
    }
    // 如果当前两个对应的节点是对称的, 那么递归判断这两个节点对应的左右孩子节点是否对称
    return recur(L.left, R.right) && recur(L.right, R.left);
}

算法数据复杂度:O(n),需要遍历树的所有节点,节点数为 n。

迭代法

public boolean isSymmetric(TreeNode root) {
    if (root == null) {
        return true;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    // 首先将根节点的左右孩子入队
    queue.offer(root.left);
    queue.offer(root.right);
    while (!queue.isEmpty()) {
        // 将队头两个节点出队
        TreeNode l = queue.poll();
        TreeNode r = queue.poll();
        // 如果两个节点都为空, 判断下一对节点
        if (l == null && r == null) {
            continue;
        }
        // 如果仅有一个节点为空, 说明不是对称的
        if (l == null || r == null) {
            return false;
        }
        // 如果两节点值不相等也不对称
        if (l.val != r.val) {
            return false;
        }

        // 将左节点的左孩子和右节点的右孩子入队
        // 之后进行判断
        queue.offer(l.left);
        queue.offer(r.right);

        // 将左节点的右孩子和右节点的左孩子入队
        // 之后进行判断
        queue.offer(l.right);
        queue.offer(r.left);
    }
    return true;
}

算法数据复杂度:O(n),需要遍历树的所有节点,节点数为 n。

总结

这个题其实是对树的两个子树进行遍历,首先我们要明确一棵二叉树要满足哪些条件它会是对称二叉树:

  • 左右子树为空
  • 左孩子节点等于右孩子节点
  • 左子树的左孩子节点等于右子树的右孩子节点,左子树的右孩子节点等于右子树的左孩子节点

根据以上三个条件我们就可以写出对应的递归算法。

同样,迭代法也是如此,对应迭代法,我们采用一个队列,首先将树的左右子树节点进队,然后对这两个节点进行以上三点判断,再将他们的左右子树对应的节点入队,如此循环,便可以判断树是否是对称的。

作者:花无缺(huawuque404.com)


欢迎关注我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~
一起进步-刷题专栏:【力扣题解】
往期精彩好文:
【CSS选择器全解指南】
【HTML万字详解】
你们的点赞 收藏⭐ 留言 关注✅
是我持续创作,输出优质内容的最大动力!
谢谢!

你可能感兴趣的:(力扣题解,leetcode,java,算法,数据结构)