(第26天)【leetcode题解】226、翻转二叉树 589、N叉树的前序遍历 590、N叉树的后序遍历

目录

  • 226、翻转二叉树
    • 题目描述
    • 思路
    • 代码
  • 589、N叉树的前序遍历
    • 题目描述
    • 思路
    • 代码
  • 590、N叉树的后序遍历
    • 题目描述
    • 思路
    • 代码
  • 思考总结

226、翻转二叉树

题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

思路

  • 题目分析:只需要把每个节点的左右孩子交换一下就可以实现整体翻转的效果。
  • 解法:在遍历过程中,把每个遍历到的节点的左右孩子进行交换。

代码

1.层序遍历

class Solution {
public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);while (!que.empty()) {int size = que.size();for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();TreeNode* tempNode = node -> left;node -> left = node -> right;node -> right = tempNode;if (node -> left) que.push(node -> left);if (node -> right) que.push(node -> right);}}return root;}
};

2.前序遍历(递归法)

  1. 递归函数的参数和返回值:当前节点的指针、返回root节点的指针
  2. 终止条件:参数代表的当前节点为空时终止
  3. 递归逻辑:前序遍历顺序为中左右,因此先翻转节点、向左递归、向右递归。
class Solution {
public://参数:root代表当前节点TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;//终止条件swap(root -> left, root -> right);//中invertTree(root -> left);//左invertTree(root -> right);//右    return root;//返回值}
};

3.前序遍历(迭代法)

class Solution {
public://参数:root代表当前节点TreeNode* invertTree(TreeNode* root) {stack<TreeNode*> st;if (root != NULL) st.push(root);while (!st.empty()) {TreeNode* node = st.top();if (node != NULL) {st.pop();if (node -> right) st.push(node -> right);//右if (node -> left) st.push(node -> left);//左st.push(node);//中st.push(NULL);//标记} else {st.pop();//先取出标记node = st.top();//中st.pop();swap(node -> left, node -> right);//翻转}}return root;}
};

589、N叉树的前序遍历

题目描述

给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
示例
输入:root = [1,null,3,2,4,null,5,6]
输出:[1,3,5,6,2,4]

思路

1.递归法

  1. 返回值:无;参数:cur指向当前节点的指针、
  2. 终止条件:cur为NULL时
  3. 递归逻辑:前序遍历中左右

2.迭代法

  • 每次遍历到一个节点,先把这个节点的值加入结果集。
  • 为了确保下一个遍历到的节点每次都是当前节点从左到右第一个子节点,把当前节点的所有子节点从右到左压入栈中。
  • 这样每次从栈顶取出元素都能确保是按照前序遍历的顺序。

代码

1.递归法

class Solution {
public://递归函数//参数:cur指向当前节点; res结果集void helper(Node* cur,vector<int>& res) {if (cur == NULL) return;//终止条件res.push_back(cur -> val);//中//递归逻辑:先顺着每个节点的靠左的子节点递归for (Node* & ch : cur -> children) {helper(ch, res);}}vector<int> preorder(Node* root) {vector<int> res;//结果集helper(root, res);return res;}
};

2.迭代法

class Solution {
public:vector<int> preorder(Node* root) {vector<int> res;if (root == NULL) return res;stack<Node*> st;st.push(root);while (!st.empty()) {Node* node = st.top();st.pop();res.push_back(node -> val);for (int i = node -> children.size() - 1; i >= 0; i--) {st.push(node -> children[i]);//把当前节点的所有子节点从右到左放入栈中}}return res;}
};

590、N叉树的后序遍历

题目描述

给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
示例
输入:root = [1,null,3,2,4,null,5,6]
输出:[5,6,3,2,4,1]

思路

1.递归法

  1. 返回值:无;参数:cur当前节点、res结果集
  2. 终止条件:当前节点cur为NULL时
  3. 递归逻辑:左右中,先通过递归,到最底层的最左边的节点,然后开始把节点值加入结果集。

2.迭代法

  1. 按照上面前序遍历的模板,把子节点压入栈的顺序颠倒一下(从右到左压入栈变成从左到右压入栈),那么最终结果集中的顺序为中右左
  2. 在把结果集翻转一下,顺序就变成了左右中,为后序遍历的顺序。

代码

1. 递归法

class Solution {
public://递归函数//参数:cur当前节点、res结果集void helper(Node* cur, vector<int>& res) {if (cur == NULL) return;//终止条件for (Node* ch : cur -> children) {helper(ch, res);}res.push_back(cur -> val);//中}vector<int> postorder(Node* root) {vector<int> res;helper(root,res);return  res;}
};

2.迭代法

class Solution {
public:vector<int> postorder(Node* root) {vector<int> res;stack<Node*> st;if (root != NULL) st.push(root);while (!st.empty()) {Node* node = st.top();st.pop();res.push_back(node -> val);//中for (Node* ch : node -> children) {st.push(ch);//把当前节点的所有子节点从左到右压入栈中}}reverse(res.begin(), res.end());//将结果集翻转return res;}
};

思考总结

  1. 树的操作都要在遍历的基础上,在遍历的过程中添加某些操作。
  2. 二叉树节点定义:
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(NULL), right(NULL)};

创建二叉树节点时要用new TreeNode(num)
3. 递归三要素:确定参数和返回值、确定终止条件、确定递归逻辑
4. 树的迭代遍历:深度优先遍历离不开、广度优先遍历离不开队列

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

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

相关文章

金融科技引领跨境支付新潮流:智慧、速度与安全的完美融合

一、引言 在全球经济日益紧密相连的今天,跨境支付作为连接各国贸易和金融活动的桥梁,正迎来金融科技带来的深刻变革。金融科技以其独特的智慧化、高效化和安全化特性,正逐步渗透到跨境支付的各个环节,为跨境支付领域带来前所未有的创新和发展。本文将探讨金融科技如何引领跨…

mysql高级刷题-01-求中位数

题目&#xff1a; 解题代码 select sum(num) / count(num) as median from (select num,row_number() over (order by num desc,id desc ) as desc_math,row_number() over (order by num ,id ) as asc_mathfrom number) as t1 where asc_math in (desc_math, desc…

java最新JDK参数设置中文版

官网地址&#xff1a;https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html ​ java最新JDK参数设置 行为选项Garbage First&#xff08;G1&#xff09;垃圾收集选项性能选项调试选项 行为选项 选项默认值描述-XX:-AllowUserSignalHandlers未设置如果应用程序…

WPF中Ignorable

在WPF中&#xff0c;“Ignorable”这个概念主要与XAML解析和标记扩展有关。当WPF的XAML解析器遇到一个它不认识的元素或属性时&#xff0c;它会抛出一个异常&#xff0c;这是因为默认情况下&#xff0c;WPF要求所有XAML都是完全可识别和可解析的。然而&#xff0c;在某些情况下…

前端实现输入内容计算密码强度

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、思路二、计算密码强度分数密码强度动画展示效果完善动画效果完整代码前言 平时我们在浏览各种网站和 APP 的时候,都接触过密码这个东西~ 密码设置的好不好,关乎到你的账号安全性,越复杂的密码越安全,所以密码强度…

微信公众号文章背景颜色改成白色

微信公众号文章背景颜色黑色&#xff0c;看不清字。 按F12 , 找到 rich_media_area_primary &#xff0c;把 background 改成 white .rich_media_area_primary {background: white; }

2024年社会发展与管理创新科学国际学术会议(ICSDMIS 2024)

2024年社会发展与管理创新科学国际学术会议&#xff08;ICSDMIS 2024&#xff09; 2024 International Conference on Social Development and Management Innovation Science&#xff08;ICSDMIS 2024&#xff09; 会议简介&#xff1a; 2024年社会发展与管理创新科学国际学术…

C语言中 printf函数格式化输出

一. 简介 本文来简单学习一下&#xff0c;C语言中printf函数格式化输出时&#xff0c;因为我们的粗心没有 将数据类型与格式化参数对应&#xff0c;而导致的一些问题。 二. C语言中printf函数的格式化输出 在C语言中&#xff0c;printf函数是用于格式化输出的函数&#xff0…

Redis 异常三连环

本文针对一种特殊情况下的Reids连环异常&#xff0c;分别是下面三种异常&#xff1a; NullPointerException: Cannot read the array length because “arg” is nullJedisDataException: ERR Protocol error: invalid bulk lengthJedisConnectionException: Unexpected end o…

NAT端口映射,实现外网访问内网服务器

目录 前言一、搭建网络拓扑1.1 配置server和pc1.1.1 配置server01.1.2 配置server11.1.3 配置pc0 1.2 配置客户路由器1.2.1 配置路由器IP1.2.2 配置静态路由 1.3 配置ISP路由器 二、配置端口映射2.1 在客户路由器配置端口映射2.2 测试公网计算机访问私网服务器2.2.1 PC0向serve…

Base64前端图片乱码转换

title: Base64码乱转换 date: 2024-06-01 20:30:28 tags: vue3 后端图片前端显示乱码 现象 后端传来一个图片&#xff0c;前端能够接收&#xff0c;但是console.log()后发现图片变成了乱码&#xff0c;但是检查后台又发现能够正常的收到了这张图片。 处理方法 笔者有尝试将…

dotenv 配置踩坑-显示undefined

今天在学习dotenv,结果自己按照官方文档巧下来竟然还是不行&#xff0c;人麻了~ 这是我的目录结构 按照配置那么&#xff0c;我们只需要在config.default.js中写入如下代码就可以实现它将环境变量从文件加载到process.env中。 但是&#xff0c;但是这里犯了一个低级错误&#…

通用高电子迁移率晶体管(HEMT)的差分微变解算方案及分析型模型

来源&#xff1a;A Difference-Microvariation Solution and Analytical Model for Generic HEMTs&#xff08;TED 22年&#xff09; 摘要 这篇论文提出了一种AlGaN/GaN和AlGaAs/GaAs基高电子迁移率晶体管(HEMT)的分析型直流模型。该模型考虑了高栅偏压下势垒层中积累的电荷。…

什么?!这年代还有人用父子组件通信?

创作背景 因为本前端菜鸟写代码从没考虑过代码是否易于维护&#xff0c;所以一旦涉及组件通信&#xff0c;一律使用Pinia状态管理&#xff0c;至于父子组件通信啥的&#xff0c;学完Pinia之后就被我狠狠抛弃了&#xff0c;当时就在想&#xff1a;为什么不直接教Pinia&#xff…

YOLO-Worldv2两分钟快速部署

本次部署使用的框架基于ultralytics&#xff0c; 并且已经集成最新版本的YOLOv8框架&#xff1a; 一键环境配置 pip install ultralytics基础使用 训练 from ultralytics import YOLOWorld model YOLOWorld(yolov8x-worldv2.pt) results model.train(datacoco8.yaml, epo…

康谋技术 | 自动驾驶:揭秘高精度时间同步技术(一)

众所周知&#xff0c;在自动驾驶中&#xff0c;主要涵盖感知、规划、控制三个关键的技术层面。在感知层面&#xff0c;单一传感器采集外界信息&#xff0c;各有优劣&#xff0c;比如摄像头采集信息分辨率高&#xff0c;但是受外界条件影响较大&#xff0c;一般缺少深度信息&…

算法导论 总结索引 | 第三部分 第十四章:数据结构的扩张

1、通过存储 额外信息的方法来扩张一 种标准的数据结构&#xff0c;然后对这种数据结构&#xff0c;编写新的操作来支持所需的应用。因为添加的信息 必须要能被该数据结构上的常规操作更新和维护 2、通过扩张红黑树构造出的两种数据结构&#xff1a;14.1介绍 一种支持一般动态…

从迷茫到精通,小李的IPD培训‘逆袭’之路!——精益咨询

谈及IPD培训&#xff0c;这确实是一个让小李心生敬畏而又充满期待的词汇。作为刚刚踏上这段“奇幻”旅程的小白&#xff0c;小李深感其不仅是一场知识的狂欢&#xff0c;更是一次思维的洗礼和团队的熔炼。 IPD&#xff0c;全称集成产品开发&#xff0c;它代表着一种前沿的产品…

JavaFX的使用-UI

目录 JavaFX的布局 24点游戏-图形版 数学应用-几何图形的绘制 表盘 JavaFX的布局

使用 Node.js 和 Azure Function App 自动更新 Elasticsearch 索引

作者&#xff1a;来自 Elastic Jessica Garson 维护最新数据至关重要&#xff0c;尤其是在处理频繁变化的动态数据集时。这篇博文将指导你使用 Node.js 加载数据&#xff0c;并通过定期更新确保数据保持最新。我们将利用 Azure Function Apps 的功能来自动执行这些更新&#xf…