代码随想录算法训练营第十三天| 102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

news2025/1/20 5:54:15

102. 二叉树的层序遍历

在这里插入图片描述

题目链接:102. 二叉树的层序遍历
文档讲解:代码随想录
状态:dfs没写出来,bfs不知道如何分层

import java.util.*;

public class BinaryTreeLevelOrderTraversal {
    // 用于存储每一层的节点值
    List<List<Integer>> res = new LinkedList<>();

    // 使用深度优先搜索 (DFS) 进行层序遍历
    public List<List<Integer>> levelOrder(TreeNode root) {
        if (root != null) {
            dfs(root, 0); // 从根节点开始,深度为0
        }
        return res;
    }

    // DFS辅助方法
    public void dfs(TreeNode root, int depth) {
        if (root == null) {
            return; // 如果当前节点为空,直接返回
        }
        if (res.size() == depth) {
            // 如果当前深度没有对应的列表,创建一个新的列表
            res.add(new ArrayList<>());
        }
        // 将当前节点的值添加到对应深度的列表中
        res.get(depth).add(root.val);
        // 递归处理左子节点,深度加1
        dfs(root.left, depth + 1);
        // 递归处理右子节点,深度加1
        dfs(root.right, depth + 1);
    }

    // 使用广度优先搜索 (BFS) 进行层序遍历
    public List<List<Integer>> bfs(TreeNode root) {
        Deque<TreeNode> queue = new LinkedList<>(); // 使用双端队列来存储节点
        if (root != null) {
            queue.addLast(root); // 将根节点加入队列
        }
        while (!queue.isEmpty()) {
            // 获取当前层的节点个数.
            // 重要!!!后面代码中利用size--处理掉每层的结点后,队列中剩下的结点就是下一层的结点
            int size = queue.size(); // 当前层的节点数
            ArrayList<Integer> list = new ArrayList<>(); // 用于存储当前层的节点值
            while (size > 0) {
                TreeNode node = queue.pollFirst(); // 取出当前层的节点
                list.add(node.val); // 将节点值加入当前层的列表
                if (node.left != null) {
                    queue.addLast(node.left); // 将左子节点加入队列
                }
                if (node.right != null) {
                    queue.addLast(node.right); // 将右子节点加入队列
                }
                size--;
            }
            res.add(list); // 将当前层的节点值列表加入结果列表
        }
        return res;
    }
}

// 定义树节点类
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

226.翻转二叉树

在这里插入图片描述

题目链接:226.翻转二叉树
文档讲解:代码随想录
状态:so easy

    // 使用递归方式进行二叉树翻转
    public TreeNode invertTree(TreeNode root) {
        if (root != null) {
            // 保存当前节点的左子节点
            TreeNode left = root.left;
            // 保存当前节点的右子节点
            TreeNode right = root.right;
            // 递归翻转右子树,并将其设为当前节点的左子节点
            root.left = invertTree(right);
            // 递归翻转左子树,并将其设为当前节点的右子节点
            root.right = invertTree(left);
        }
        // 返回翻转后的根节点
        return root;
    }

    // 使用广度优先搜索 (BFS) 进行二叉树翻转
    public TreeNode bfs(TreeNode root) {
        if (root != null) {
            // 创建一个双端队列来存储节点
            Deque<TreeNode> deque = new LinkedList<>();
            // 将根节点加入队列
            deque.addLast(root);
            // 当队列不为空时,继续处理
            while (!deque.isEmpty()) {
                int size = deque.size(); // 当前层的节点数
                // 遍历当前层的所有节点
                while (size-- > 0) {
                    // 取出当前层的节点
                    TreeNode node = deque.pollFirst();
                    // 翻转当前节点的左右子节点
                    TreeNode temp = node.left;
                    node.left = node.right;
                    node.right = temp;
                    // 如果左子节点不为空,将其加入队列
                    if (node.left != null) {
                        deque.add(node.left);
                    }
                    // 如果右子节点不为空,将其加入队列
                    if (node.right != null) {
                        deque.add(node.right);
                    }
                }
            }
        }
        // 返回翻转后的根节点
        return root;
    }

101. 对称二叉树

在这里插入图片描述

题目链接:101. 对称二叉树
文档讲解:代码随想录
状态:递归写出来了,迭代没写出来

    // 判断二叉树是否对称
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true; // 如果根节点为空,则认为是对称的
        }
        TreeNode left = root.left;
        TreeNode right = root.right;
        // 比较根节点的左右子树是否对称
        return compare(left, right);
    }

    // 辅助方法:比较两个子树是否对称
    public boolean compare(TreeNode left, TreeNode right) {
        if (left == null && right == null) {
            return true; // 如果两个子树都为空,则对称
        } else if (left == null || right == null) {
            return false; // 如果其中一个子树为空,则不对称
        } else {
            // 比较左子树的左子树与右子树的右子树,左子树的右子树与右子树的左子树,以及当前节点的值是否相等
            return compare(left.left, right.right) && compare(left.right, right.left) && left.val == right.val;
        }
    }
    public boolean isSymmetric(TreeNode root) {
        if (root == null || (root.left == null && root.right == null)) {
            return true;
        }
        Deque<TreeNode> stack = new LinkedList<>();
        stack.addLast(root.left);
        stack.addLast(root.right);
        while (!stack.isEmpty()) {
            TreeNode right = stack.pollLast();
            TreeNode left = stack.pollLast();

            // 如果两个节点都为空,继续下一次循环
            if (left == null && right == null) {
                continue;
            }
            // 如果一个节点为空,另一个节点不为空,则不对称
            if (left == null || right == null) {
                return false;
            }
            // 如果两个节点的值不相等,则不对称
            if (left.val != right.val) {
                return false;
            }
            stack.addLast(left.left);
            stack.addLast(right.right);

            stack.addLast(left.right);
            stack.addLast(right.left);
        }
        return true;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1790103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据之Schedule调度错误(一)

当我们在利用ooize发起整个任务的调度过程中,如果多个调度任务同时运行并且多个调度任务操作了相同的表,那么就会出现如下的错误关系: Invalid path hdfs://iZh5w01l7f8lnog055cpXXX:8000/user/admin/xxx: No files matching path hdfs://iZh5w01l7f8lnog055cpXXX:8000/user/ad…

MySQL—函数(介绍)—字符串函数(基础)

一、引言 提到函数&#xff0c;在SQL分类中DQL语句中有一个聚合函数&#xff0c;如COUNT()、SUM()、MAX()等等。这些都是一些常见的聚合函数&#xff0c;而聚合函数只是函数的一种&#xff0c;接下来会详细的学习和介绍一下函数的应用场景和以及 mysql 当中文件的函数有哪些。 …

JAVA小案例-用循环语句输出1-1000以内能被5整除的数,每5个一行

JAVA小案例-用循环语句输出1-1000以内能被5整除的数&#xff0c;每5个一行 直接看代码&#xff1a; public class Zhengchu {/*** 用循环语句输出1-1000以内能被5整除的数&#xff0c;每5个一行** param args*/public static void main(String[] args) {for (int i 1; i <…

HTML 转义字符(escape characters)及其对应的符号(symbols)

以下是常见的 HTML 转义字符及其对应的符号&#xff0c;这些可以用于在 HTML 或 JSX 中避免解析错误和特殊字符的冲突&#xff1a; 空格 ( ): 或 引号: 单引号&#xff08;&#xff09;&#xff1a;&apos;、&lsquo;、、&rsquo;双引号&#xff08;"&#x…

GPS定位器专用可编程晶振SG-8018CB

随着全球定位系统&#xff08;GPS&#xff09;技术的普及&#xff0c;GPS定位器在各种领域中得到了广泛应用&#xff0c;如车辆跟踪、个人定位、资产管理和户外活动等。为了确保GPS定位器的高精度和可靠性&#xff0c;选择合适的时钟源至关重要。SG-8018CB可编程晶振作为一款高…

Linux:基本指令

文章目录 ls指令pwd指令cd指令touch指令mkdir指令rmdir指令 && rm指令cp指令man指令echo指令输出重定向追加重定向 cat指令输入重定向 mv指令which指令alias指令more && less指令head && tail指令事件相关的指令date显示时间戳 cal指令find指令grep指令…

十三、resultMap解析

分为两部分&#xff1a;解析和使用 解析 1.解析XML的时候单独解析所有的resultMap标签&#xff0c;封装成ResultMap对象存入configuration中 2.解析XML中的SQL语句&#xff0c;封装MappedStatement对象&#xff0c;这里会根据SQL的返回类型是resultMap还是resultType做处理。如…

乡村振兴与乡村旅游品牌化:打造具有地方特色的乡村旅游品牌,提升乡村旅游吸引力,促进美丽乡村建设

目录 一、引言 二、乡村旅游品牌化的重要性 &#xff08;一&#xff09;增强乡村旅游的辨识度 &#xff08;二&#xff09;提升乡村旅游的附加值 &#xff08;三&#xff09;促进乡村文化的传承与创新 三、打造具有地方特色的乡村旅游品牌 &#xff08;一&#xff09;明…

人工智能与能源约束的矛盾能否化解

以下文章来源&#xff1a;澎湃新闻 人工智能技术在台前展示的是比特世界的算力、算法和数据&#xff0c;但其“轻盈的灵魂”背后则是土地、能源和水等物理世界“沉重的肉身”。根据本文三种情境的模拟测算&#xff0c;未来人工智能发展需要可持续的巨量能源支撑&#xff0c;能源…

使用 NVIDIA NIM 部署生成式 AI 的简单指南

使用 NVIDIA NIM 部署生成式 AI 的简单指南 无论您是在本地还是在云端工作&#xff0c;NVIDIA NIM 推理微服务都可以为企业开发人员提供来自社区、合作伙伴和 NVIDIA 的易于部署的优化 AI 模型。作为 NVIDIA AI Enterprise 的一部分&#xff0c;NIM 提供了一条安全、简化的前进…

Excel 每 N 行拼成一行

F列每四行对应一条记录&#xff1a; ABCDEF1NameAddressCityShort IDCompany 122222 al street3Blue cheese415Company 261111 arm rd7Ranch829Company 3103333 raindrop drive11Peanut123 需要把F列整理成规范表格&#xff0c;按行写入A-D&#xff1a; ABCDEF1NameAddressC…

python中return语句的用法

一、了解函数的标准格式 def 函数名(参数1, 参数2, ...&#xff0c;参数n):函数体第一行代码函数体第二行代码函数体第三行代码...return 语句变量 函数名(参数1&#xff0c;参数2&#xff0c;...&#xff0c;参数n) python遇到return语句时&#xff0c;会结束整个函数调用&a…

VS2017配置OpenCV4.5.1

VS2017配置OpenCV 一、下载OpenCV二、配置OpenCV的电脑环境变量三、配置visual Studio添加路径复制文件到C盘 四、如何使用注意运行时选择Debug x64 五、报错&#xff1a;VSOpencv出现&#xff1a;xxx处有未经处理的异常: Microsoft C 异常: cv::Exception&#xff0c;位于内存…

OBS+nginx+nginx-http-flv-module实现阿里云的推流和拉流

背景&#xff1a;需要将球机视频推送到阿里云nginx&#xff0c;使用网页和移动端进行播放&#xff0c;以前视频格式为RTMP&#xff0c;但是在网页上面播放RTMP格式需要安装flash插件&#xff0c;chrome浏览器不给安装&#xff0c;调研后发现可以使用nginx的模块nginx-http-flv-…

剪画小程序:AI声音克隆,只需10秒完美复制真人音色

Hello&#xff0c;大家好呀&#xff01;我是分享声音的克隆。 想象一下&#xff0c;如果你能够复制自己的声音&#xff0c;那么您可以给视频配上自己的声 音&#xff0c;那是多么的有趣啊。 ​编辑 工具&#xff1a;小程序剪画 功能简介&#xff1a;支持多种端口&#xff1…

任务3.3 学生喂养三种宠物:猫、狗和鸟

本任务旨在通过Java面向对象编程中的多态性和方法重载概念&#xff0c;实现一个学生喂养三种不同宠物&#xff08;猫、狗、鸟&#xff09;的程序。 定义基类和派生类 创建一个Animal基类&#xff0c;包含所有动物共有的属性和方法&#xff0c;如name、age、speak()、move()和ea…

自然语言处理(NLP)—— C-value方法

自然语言处理&#xff08;NLP&#xff09;和文本挖掘是计算机科学与语言学的交叉领域&#xff0c;旨在通过计算机程序来理解、解析和生成人类语言&#xff0c;以及从大量文本数据中提取有用的信息和知识。这些技术在现代数据驱动的世界中扮演着关键角色&#xff0c;帮助我们从海…

三、Nginx配置文件

目录 一、Nginx的文件内容 二、去除注释之后的文件 三、配置文件详解 1、全局块 &#xff08;1&#xff09;user 指令&#xff1a; &#xff08;2&#xff09;worker_processes&#xff1a; &#xff08;3&#xff09;daemon &#xff08;4&#xff09;pid &#xff08…

opencv-python(五)

opencv的颜色通道中顺序是B&#xff0c;G&#xff0c;R。 图像属性 import cv2img cv2.imread(jk.jpg) print(fshape{img.shape}) print(fsize{img.size}) print(fdtype{img.dtype}) shape&#xff1a;图像像素的行&#xff0c;列&#xff0c;通道 size&#xff1a;行数 X …

LWIP_TCP 协议

目录 1 TCP 协议简介 1.1 TCP 协议简介 1.2 TCP 的建立连接 1.3 TCP 终止连接 1.4 TCP 报文结构 1.5 lwIP 的 TCP 报文首部数据结构 1.6 lwIP 的 TCP 连接状态图 1 TCP 协议简介 1.1 TCP 协议简介 TCP&#xff08;Transmission Control Protocol 传输控制协议&#xff0…