刷代码随想录有感(43):遍历N叉树

题干:N叉树的前序遍历、后序遍历、层序遍历。

代码:

class Node{//前序遍历N叉树(递归实现)
public:int val;vector<Node*>children;Node(int _val, vector<Node*>_children): val(_val), children(_children){}
};class solution{
public:void traversal(Node* node, vector<int> &a){if(node == NULL) return;a.push_back(node -> val);//前序遍历中心思想:先访问当前节点再访问子节点for(int i = 0; i < node -> children.size(); i++){traversal(node -> children[i], a);}}void preorder(Node* root){vector<int>res;traversal(root,res);return res;}
}
class Node{//后序遍历N叉树(递归实现)
public:int val;vector<Node*>children;Node(int _val, vector<Node*>_children): val(_val), children(_children){}
};class solution{
public:void traversal(Node* node, vector<int> &a){if(node == NULL) return;//a.push_back(node -> val);for(int i = 0; i < node -> children.size(); i++){traversal(node -> children[i], a);}a.push_back(node -> val);//后序遍历中心思想:先访问子节点再访问当前节点}void postorder(Node* root){vector<int>res;traversal(root,res);return res;}
}
class Node{//层序遍历N叉树(迭代实现)
public:int val;vector<Node*>children;Node(int _val, vector<Node*>_children): val(_val), children(_children){}
};class Solution {
public:vector<vector<int>> levelOrder(Node* root) {queue<Node*>que;vector<vector<int>>res;if(root != NULL)que.push(root);while(!que.empty()){int size = que.size();vector<int>tmp;while(size--){//for(int i = 0; i < size; i++)也行Node* node = que.front();que.pop();tmp.push_back(node -> val);for(int i = 0; i < node -> children.size(); i++){if(node -> children[i]) que.push(node -> children[i]);}}res.push_back(tmp);}return res;}
};

不难观察到,相较于二叉树,N叉树代码改动的地方只有将if(node-> left(right))que.push(node->left(right))改成了for(int i =0; i < node -> children.size(); i++){if(node->children[i]) que.push(node->children[i])}

补充:

class Solution {//前序遍历的迭代实现
public:vector<int> preorder(Node* root) {stack<Node*>st;vector<int>res;if(root != NULL)st.push(root);while(!st.empty()){Node* node = st.top();st.pop();if(node != NULL){st.push(node);//先搜父节点st.push(NULL);for(int i = 0; i < node -> children.size(); i++){if(node -> children[i]) st.push(node -> children[i]);}//再搜子节点}else{Node* node = st.top();st.pop();res.push_back(node -> val);}}reverse(res.begin(), res.end());//最后需要翻转resreturn res;}
};
class Solution {//后序遍历的迭代实现
public:vector<int> postorder(Node* root) {stack<Node*>st;vector<int>res;if(root != NULL)st.push(root);while(!st.empty()){Node* node = st.top();st.pop();if(node != NULL){for(int i = 0; i < node -> children.size(); i++){if(node -> children[i]) st.push(node -> children[i]);}//先搜子节点st.push(node);//再搜父节点st.push(NULL);}else{Node* node = st.top();st.pop();res.push_back(node -> val);}}reverse(res.begin(), res.end());//也要翻转return res;}
};

对于前后序遍历的迭代实现注意:它们与递归实现思想一致,是“前”就先父后子,是“后”就先子后父。不过迭代要注意最后要反转res

总之,涉及N叉的(带有children) ,递归实现只需要改if(node->left/right)...位置即可;但是迭代实现需要最后反转一下res。把握住前后就行了。

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

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

相关文章

13.接口自动化学习-Pytest结合Yaml使用

问题&#xff1a;项目自动化测试脚本迭代出现变革技术方案 要求&#xff1a;测试用例从excel–变为yaml用例 注意事项&#xff1a; 1&#xff09;尽可能少改代码 2&#xff09;新技术方案yaml读取&#xff0c;尽可能写成一样的数据返回 [(请求体1,响应数据1),(请求体2,响应数据…

AR模块中通用对账的优化尝试

背景&#xff1a; 用户在唯品会下单后&#xff0c;是可以自由选择不同支付方式进行支付的&#xff0c;支付后&#xff0c;支付系统会将一笔收款单传送给AR&#xff0c;AR财务可以从此处看到收款情况。但是&#xff0c;真实的资金是按照不同支付方式&#xff0c;由银行或者其他渠…

ffmpeg初体验

一&#xff1a;安装 sudo yum install epel-release -y sudo yum update -ysudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpmyum -y install …

在 Oracle 数据库中使用正则表达式

在 Oracle 数据库中使用正则表达式 0. 引言1. 什么是正则表达式&#xff1f;2. Oracle 数据库正则表达式支持3. 用于正则表达式的 Oracle 数据库 SQL 函数4. 正则表达式中支持的元字符5. 构建正则表达式 0. 引言 本文介绍 Oracle 数据库的正则表达式支持。本文涵盖以下主题&am…

Unity构建详解(10)——Unity构建流程

【前言】 我们知道从源代码到可执行文件有四个步骤&#xff1a;预编译、编译、汇编、链接 预编译&#xff1a;处理源代码文件中的以“#”开始的各种预编译指令编译&#xff1a;通过语法语义分析等将源代码文件转为中间语言文件并进行优化&#xff0c;再生成汇编代码文件汇编&…

Vs Code npm install 报错解决方法

用的人家的前端框架发现是封装过的&#xff0c;要修改人家前端的话还得把前端源码放在Vs Code 上运行&#xff0c;后端放在IDEA上运行&#xff0c;然后前后端并行开发&#xff0c;在配置前端环境时遇到&#xff1a; npm install 这个的原因是我把node下载到D盘了权限不够框框爆…

android学习笔记(五)-MVP模式

1、MVP模式demo的实现&#xff0c;效果下&#xff1a; 2、创建一个Fruit类&#xff1a; package com.example.listview; //Fruit类就是Model&#xff0c;表示应用程序中的数据对象。 public class Fruit {private int imageId;private String name;private String price;publi…

代码随想录算法训练营Day6 | 242.有效的字母异位词 ●349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

基础&#xff1a; 1.哈希表是根据关键值进行直接访问的数据结构&#xff0c;时间复杂度是O(1)&#xff0c;也就是通过数组的索引下标&#xff0c;直接访问数组中的元素哈希表的作用就是用来快速判断一个元素是否出现在集合里。 2.常见的哈希结构&#xff1a; 数组set &#…

计算机视觉 | 交通信号灯状态的检测和识别

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在使用计算机视觉技术检测交通信号灯的状态&#xff0c;主要针对红色和绿色信号灯的识别。通过分析输入图像中的像素颜色信息&#xff0c;利用OpenCV库实现对信号灯状态的检测和识别。 目录 一、项目背景 二、项目功能…

CalcPad(2) 单位设置和绘制图表

CalcPad(2) 单位设置和绘制图表 Hi uu们&#xff0c;CalcPad用的还好吗&#xff1f;有发现一些问题吗&#xff1f; 在我的使用中&#xff0c;经常需要指定一些计算结果的符号&#xff0c;比如说我希望ADC最小分辨率的计算结果是以uV展示&#xff0c;那我们该怎么操作呢&#…

DB索引B+树SQL优化

数据库的索引就像一本书的目录&#xff0c;查数据快人一步&#xff0c;快速定位&#xff0c;精准打击&#xff01; 什么是数据库的索引&#xff1f; 官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说&#xff0c;数据库索引好比是一本书前面的目录&#xff0c;能加…

php时间人性化展示

在PHP中,可以使用date()函数和strtotime()函数来实现时间的人性化展示。下面是一个示例代码: <?php // 获取当前时间戳 $timestamp = time();// 格式化时间 $formattedTime = date(Y年m月d日 H:i:s, $timestamp);echo

入坑 Node.js 1

原文&#xff1a;https://blog.iyatt.com/?p14717 前言 前面刚刚对 Spring Boot 有了个概念&#xff0c;再来学学 Node.js&#xff0c;顺便当学 JavaScript&#xff0c;为后面入前端做准备。 环境 Node.js 20.12.2 官方 API 文档&#xff1a;https://nodejs.org/docs/lat…

IBM SPSS Statistics for Mac:强大的数据分析软件

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件&#xff0c;专为Mac用户设计&#xff0c;提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生&#xff0c;都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

day_8题解

利用最大公约数求最小公倍数 #include<iostream> using namespace std;int gcd(int a,int b) {return b?gcd(b,a%b):a; }int main() {long long a,b;cin>>a>>b;long long ansgcd(a,b);cout<<(a*b)/ans<<endl;return 0; }排序遍历&#xff0c;记…

支持中文繁体,支持同时配置并启用飞书和Lark认证,JumpServer堡垒机v3.10.8 LTS版本发布

2024年4月22日&#xff0c;JumpServer开源堡垒机正式发布v3.10.8 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和优化&#xff0c;并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS最新版本&#xff0c;以获得更佳的使用体验。 在v3.10.8 LTS版本中&…

一款支持串口、网口自定义协议的调试软件

ComMax通讯调试软件是一款支持自定义串口&#xff0c;网口通讯协议的调试软件&#xff0c;用户可以根据需要&#xff0c;自定义协议包&#xff0c;然后根据接受的数据选择要发送的数据包。是一款强大、好用的调试软件。 点击下载 提取码&#xff1a;wmfg 不用安装 下载解压即…

《史铁生》-随记

史铁生的文案进一段总是刷到&#xff0c;文字在某些时候真的是一种无形的动力。小时候学过的书&#xff0c;长大了才会更加理解其中的蕴意。如看到的文字所说&#xff0c;教育具有长期性和滞后性&#xff0c;就像一个闭环&#xff0c;多年后你有一个瞬间突然意识到什么&#xf…

怎么通过微信小程序实现远程控制包间内的电器

怎么通过微信小程序实现远程控制包间内的电器呢&#xff1f; 本文描述了使用微信小程序调用HTTP接口&#xff0c;实现控制包间内的电器&#xff0c;专用的包间控制器&#xff0c;可独立控制包间内的全部电器&#xff0c;包括空调。 可选用产品&#xff1a;可根据实际场景需求&…

Vue3 ts使用echarts

在 Vue 3 中&#xff0c;我们使用 ref 来访问元素节点&#xff0c;通过声明变量的方式来获取元素。 在template中&#xff0c;添加一个panel&#xff0c;需要指定尺寸 <div ref"area_panel" style"height:250px;width: 600px;"></div> 在sc…