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;
    }
}
相关推荐
Reart1 分钟前
Leetcode 123.买卖股票的最佳时期3(内有随心谈,718)
后端·算法
可编程芯片开发27 分钟前
基于RMDCFT算法的天基雷达空间机动目标检测方法MATLAB仿真,对比FRFT和DFT算法
算法
noipp1 小时前
推荐题目:洛谷 B2099 矩阵交换行
线性代数·算法·矩阵
五条凪3 小时前
简单理解 BM25 与 TF-IDF
人工智能·算法·搜索引擎·全文检索·tf-idf
行者全栈架构师3 小时前
【码动四季】Spring Boot 可观测性体系:Micrometer + OpenTelemetry + Grafana 全链路搭建
java·算法·架构
TCW11213 小时前
AI底层系列:用C++实现线性代数的公式推导与算法设计-8.线性变化(3)
c++·人工智能·算法
皓月斯语4 小时前
B3849 [GESP样题 三级] 进制转换 题解
c++·算法·题解
中微极客4 小时前
剪枝与量化:让YOLO在边缘设备上高效部署
算法·yolo·剪枝
牢姐与蒯4 小时前
双指针算法
数据结构·算法