【树的遍历】

题目

代码

#include<bits/stdc++.h>
using namespace std;const int N = 40;int in[N], pos[N]; //中序、后序
int idx[N]; //中序的值->索引
unordered_map<int, int> l, r; //根节点的左、右树根节点
int n;
int build(int il, int ir, int pl, int pr)
{int root = pos[pr];int k = idx[root];if(il < k) l[root] = build(il, k-1, pl, pl + k - 1 - il);if(k < ir) r[root] = build(k+1, ir, pl + k - 1 - il + 1, pr-1);return root;
} 
void bfs(int root)
{queue<int> q;q.push(root);while(!q.empty()){int fr = q.front();cout << fr << " ";q.pop();if(l.count(fr)) q.push(l[fr]);if(r.count(fr)) q.push(r[fr]);}
}
int main()
{cin >> n;for(int i = 1; i <= n; i++) cin >> pos[i];for(int i = 1; i <= n; i++) cin >> in[i], idx[in[i]] = i;int root = build(1, n, 1, n);bfs(root);return 0;
}

思考

对于树的遍历,算法应设计如下

层序:bfs(queue)

先序:dfs(递归)  (先输出)    or dfs(stack)(不论先后输出)

中序:dfs(递归)(中间输出)

后序:dfs(递归)(后面输出)

理解

queue+先左再右就可以保证同一层中从左到右,不同层之间从上到下。

根据序列遍历的要求,要先左根再右根。所以递归要先左再右。

但是用stack模拟要反着来,先压入右节点,再压入左节点。然后左节点出又是如此,这样就像上面那个先左再右,右生左继续先左再右了。

提一个问题:为什么递归中改变输出的时机可以在不同序列间切换,但是在stack中不行?

答:递归中的子递归也有输出操作,从代码上看,就像左子输出、右子输出和根节点输出在排序一样;而stack中的输出就是当前top节点的值(不是递归,没有子输出),于是输出顺序和访问顺序相同,是定死的先序。要改变序列,必须从访问顺序上下手

补充

(递归,先中后序列)

void firsto(int root)
{cout << root << " ";if(l.count(root)) firsto(l[root]);if(r.count(root)) firsto(r[root]);
}
void ino(int root)
{if(l.count(root)) ino(l[root]);cout << root << " ";if(r.count(root)) ino(r[root]);
}
void poso(int root)
{if(l.count(root)) poso(l[root]);if(r.count(root)) poso(r[root]);cout << root << " ";
}

(stack,先序)

void first_dfs(int root)
{stack<int> s;s.push(root);while(!s.empty()){int fr = s.top();cout << fr << " ";s.pop();if(r.count(fr)) s.push(r[fr]);if(l.count(fr)) s.push(l[fr]);}
}

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

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

相关文章

vite + tsc 打包报TS类型错误问题及解决方法

当新建vue3项目&#xff0c;package.json文件会自动添加一些配置选项&#xff0c; 这些选项基本没有问题&#xff0c;但是在实际操作过程中&#xff0c;列举一个目前我遇到的一个问题&#xff1a;打包后报了一堆TS类型错误&#xff0c;怎么消除这些错误&#xff1f; 报错信息&a…

ubuntu20从docker安装到制作自己的镜像使用记录

ubuntu20从docker安装到制作自己的镜像使用记录 第一章&#xff1a;配置环境 1.ubuntu20 2.docker镜像18.04 3.参考&#xff1a;https://www.runoob.com/docker/docker-tutorial.html 第二章&#xff1a;安装docker 一、安装docker 参考1&#xff1a;Ubuntu安装docker并运…

Go语言编程大全,web微服务数据库十大专题精讲

本课程主要从数据结构、Go Module 依赖管理、IO编程、数据库编程、消息队列、加密技术与网络安全、爬虫与反爬虫、web开发、微服务通用技术、Kitex框架等方面讲解~ 链接&#xff1a;https://pan.quark.cn/s/d65337a0e60d

视频循环存储的实现

目录 1. 三方工具 2. 视频存储的实现 2.1 分段存储 - 比如每15分钟 2.2 对齐到15分钟整边界 2.3 循环存储的实现 video_space_daemon.sh 3.封装 3.1 主执行程序&#xff0c;修订版 3.2 创建服务 3.3 service关联的执行脚本文件 4.额外的工作 附录A: ffmpeg视频存储…

矩阵算法的介绍和实现

一. 介绍 首先我们要清楚矩阵是什么&#xff1a;矩阵是一个按照长方阵列排列的复数或实数集合 1> 定义 定义&#xff1a;mn矩阵为mn个数排成的m行n列的表格&#xff0c;当mn时&#xff0c;矩阵A称为n阶方阵或者n阶矩阵。零矩阵&#xff1a;矩阵所有元素都为0。同型矩阵&a…

一个简单的录音软件(利用QT录音,ffmpeg进行音频重采样,fdk-aac编码)

录音软件是一种非常有用的工具&#xff0c;可以帮助我们记录和存储语音信息。在本文中&#xff0c;我们将介绍一个简单的录音软件&#xff0c;该软件利用QT进行录音&#xff0c;使用ffmpeg进行音频重采样&#xff0c;并使用fdk-aac编码。 一、 环境介绍 1、QT版本: QT5.…

SuccBI+低代码文档中心 — 可视化分析(仪表板)(上)

有关仪表板的设计器&#xff1a; 查询设置 由于仪表板的设计器是所见即所得的&#xff0c;可以将当前制作的内容和数据的查询结果实时展示在界面中&#xff0c;当引入到仪表板的模型数据量较大时&#xff0c;为了提高设计器界面的查询性能&#xff0c;提供了以下两种方法&…

Azure openai connection with javascript

题意&#xff1a;使用JavaScript与Azure OpenAI进行连接 问题背景&#xff1a; I have created my chatbot with javascript and used open ai. I need to change it to azure open ai but can not find the connection details for javascript. This is how i connect with p…

基于C#调用文心一言大模型制作桌面软件(可改装接口)

目录 开发前的准备账号注册应用创建应用接入开始开发创建项目设计界面使用 AK,SK 生成鉴权签名窗体代码百度智能云千帆大模型平台什么是百度智能云千帆大模型平台模型更新记录开发前的准备 账号注册 访问百度智能云平台,通过百度账号登录或手机号验证。 点此跳转百度智能云平…

数值分析【4】

目录 ​编辑第六章 数值积分微分 龙贝格 高斯求积 查表&#xff1f; 插值求导 两点 ​编辑 三点​编辑 第七章 ode 龙哥库塔 线性多步法 第八章 eig 幂法&#xff1a;v-》Av-》AAv-》……​编辑 反幂法 每次成得是A逆&#xff0c;这样得到摸最小的特征值​编辑 Q…

ubuntu大模型GPU版本安装及部署

版本查看&#xff1a; nvidia-smi 离线下载地址&#xff1a; 下载 NVIDIA 官方驱动 | NVIDIA (选型) Linux x64 (AMD64/EM64T) Display Driver | 535.146.02 | Linux 64-bit | NVIDIA(选型结果) 下载 NVIDIA 官方驱动 | NVIDIA apt-get update 禁用nouveau(nouveau是通用的…

【深度学习|目标跟踪】快速入门卡尔曼滤波!

卡尔曼滤波详解 申明一、什么是卡尔曼滤波1.1 卡尔曼滤波的使用场景1.2 卡尔曼滤波的定义 二、卡尔曼滤波公式详解&#xff08;无推导&#xff09;三、卡尔曼滤波的简单应用 申明 本博客参考了b站up主“华南小虎队”的卡尔曼滤波教学视频以及Lauszus Kristian Sloth Lauszus的卡…

企业微信无法正常启动 报错0xc0000142

解决办法&#xff1a; 1、根据处理器不同位数打开如下目录 32位&#xff1a;C:\Windows\System32 64位&#xff1a;C:\Windows\SysWOW64 我电脑是64位的&#xff0c;就打开&#xff1a;C:\Windows\SysWOW64&#xff0c;然后搜索&#xff1a;kernel32.dll 2、复制一份这个文件至…

Advanced IP Scanner - 网络扫描工具介绍

Advanced IP Scanner 是一款免费、快速且用户友好的网络扫描工具。它能够帮助用户扫描局域网&#xff08;LAN&#xff09;中的所有设备&#xff0c;提供详细的设备信息&#xff0c;包括IP地址、MAC地址、设备名称和厂商信息。该工具对IT管理员和普通用户都非常有用&#xff0c;…

2024剪辑神器盘点:四大热门剪辑软件推荐!

亲爱的朋友们&#xff0c;想要制作出精彩短视频&#xff0c;却苦于找不到合适的剪辑工具&#xff1f;别担心&#xff0c;今天要向大家推荐几款剪辑软件&#xff0c;它们能帮助大家更好地完成视频创作&#xff01; 福昕视频剪辑 链接&#xff1a;www.pdf365.cn/foxit-clip/ 对…

【爬虫实战】利用代理爬取电商数据

文章目录 前言工具介绍实战获取网站数据编写代码数据展示 推荐总结 前言 当今电商平台正经历着快速的转型与升级。随着技术的进步和用户需求的多样化&#xff0c;电商不仅从简单的在线购物演变为综合性的购物生态系统&#xff0c;还融合了人工智能、大数据和云计算等先进技术。…

zdppy+vue3+onllyoffice开发文档管理系统项目实战 20240808 上课笔记

遗留的问题 1、实现删除的功能 2、分享的功能暂时往后放&#xff0c;因为目前没有用户&#xff0c;等有了用户之后再考虑做 3、增加新建和导入按钮 zdppy的学习计划 机器学习平台&#xff0c;QQ音乐的开源项目&#xff0c;https://github.com/tencentmusic/cube-studio&#…

手表运动报告生成以及手机展示

一.运动报告组成部分 一般一份运动健康的报告包括以下信息&#xff1a; 1.运动轨迹区。2.报告数据区。(运动总体概览&#xff0c;如距离&#xff0c;时长&#xff0c;训练表现等)3.曲线图表区。(心率曲线&#xff0c;海拔曲线&#xff0c;速度&#xff0c;配速曲线) 二.组成部…

3.OpenFeign与负载均衡

文章目录 什么是 OpenFegin0penFeign 与 Ribbon.对 consumer 的改造超时配置请求响应的压缩设置选择远程调用的底层实现技术OpenFegin 整合 LoadBalancer 负载均衡负载均衡策略的更换小结 前面消费者对于微服务的消费是通过 RestTemplate 完成的,这种方式的弊端是很明显的:消费…

Qt实现圆形窗口

重新实现paintEvent()函数。 效果如下&#xff1a; 效果为蓝色区域&#xff0c;背景是vs接面&#xff0c;代码直接复制可用&#xff0c;留给有需要的人。 #ifndef CircleWidget_h__ #define CircleWidget_h__#include <QWidget>class CCircleWidget : public QWidget {Q…