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;
    }
}
相关推荐
不知名的忻1 小时前
堆排序(Java)
java·数据结构·算法·排序算法
_深海凉_1 小时前
LeetCode热题100-二叉树的最大深度
算法·leetcode·职场和发展
智者知已应修善业1 小时前
【51单片机独立按键和定时器中断的疑惑验证】2023-11-2
c++·经验分享·笔记·算法·51单片机
折翅嘀皇虫1 小时前
【无标题】steal_work_thread_pool
服务器·前端·算法
zzzsde1 小时前
【Linux】线程概念与控制(3):线程ID&&C++封装线程
linux·运维·服务器·开发语言·算法
handler011 小时前
滑动窗口(同向双指针)算法:模板与例题解析
c语言·c++·笔记·算法·蓝桥杯·双指针·滑动窗口
Brilliantwxx2 小时前
【算法题】基础计算器的不同实现方式
c++·算法
Sunsets_Red2 小时前
P12375 「LAOI-12」MST? 题解
c++·算法·洛谷·信息学·oier·洛谷题解
_深海凉_2 小时前
LeetCode热题100-二叉树的直径
算法·leetcode·职场和发展