LeetCode--101. 对称二叉树(二叉树)

题目描述

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

示例 1:

复制代码
输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

复制代码
输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

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

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

代码

使用递归法:

java 复制代码
/**
 * 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 isSame(TreeNode left, TreeNode right){
        if(left == null || right == null) return left==right;
        // 这一层的左右 && 下一层的外侧 && 下一层的里侧
        return left.val == right.val && isSame(left.left, right.right) && isSame(left.right, right.left);
    }
    
    public boolean isSymmetric(TreeNode root) {
        // 使用递归法
        if(root == null) return true;
        return isSame(root.left, root.right);
    }
}

借助列表,层序遍历:

java 复制代码
/**
 * 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) {
        List<TreeNode> que = new LinkedList<>();
        if(root.left == null && root.right == null) return true;
        que.add(root);
        while(!que.isEmpty()){
            int size = que.size();
            // 先做比较
            for(int i=0; i<size/2; i++){
                TreeNode pre = que.get(i);
                TreeNode last = que.get(size-i-1);
                if(pre == last) continue;
                if(pre == null || last == null || pre.val != last.val) return false;
            }
            // 再新增子节点 null也要
            for(int i=0; i<size; i++){
                TreeNode node = que.remove(0);
                if(node != null){
                    que.add(node.left);
                    que.add(node.right);
                }
                
            }
        }
        return true;
    }
}
相关推荐
moshuying9 小时前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
没落之王9 小时前
历史系统建模:宋初太祖太宗「再立天庭」秩序重构推演
人工智能·算法·重构
INGNIGHT9 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying9 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法
小超人诞生日记10 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
labuladong11 小时前
机器学习&神经网络 系列教程上线
神经网络·算法·机器学习
xiangyun6111 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
学习论之费曼学习法11 小时前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵
Carl_奕然11 小时前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d
w_zero_one11 小时前
算法--桶思想
java·开发语言·算法