先序与中序||后序与中序||先序与后序,求二叉树

模板通用,递归思路

树的结构:

struct node{int v;node* l;node* r;node(int u):v(u){}//构造函数
}//树的结构
int post[N],pre[N],in[N];//遍历的节点顺序

遍历顺序的性质

先序遍历:根左右,第一个节点为根节点,根节点后一个节点为左子树根节点

后序遍历:左右根,最后一个节点为根节点,根节点前一个节点为右子树根节点

中序遍历:左根右,根节点的左边为左子树节点,右边为右子树节点

先序(preorder)与中序(inorder)

先序遍历是根左右,递归处理时从前往后推即可,递归构造树时先构造左子树,再构造右子树

int pos=0;
node* create(int l,int r){//l,r为中序遍历的该子树边界if(l>r)return new node(-1);node* nod=new(pre[pos++]);//遍历根(从前往后推)int mid;//找到根节点在中序遍历中的位置,以此划分左右子树for(mid=l;mid<=r;mid++){if(nod->v==in[mid])break;}nod->l=create(l,mid-1);//先创建左子树nod->r=create(mid+1,r);//后创建右子树return nod;
}

后序(postorder)与中序(inorder) 

后序为左右根,故从后往前推,递归构造树时先构造右子树,再构造左子树

int pos=n-1;
node* create(int l,int r){//l,r为中序遍历的边界if(l>r)return new node(-1);node* nod=new node(post[pos--]);//遍历根(后序遍历的最后一个节点往前推)int mid;//找到根节点在中序遍历中的位置,以此划分左右子树for(mid=l;mid<=r;mid++){if(nod->v==in[mid])break;}nod->r=create(mid+1,r);//先创建右子树nod->l=create(l,mid-1);//后创建左子树return nod;
}

先序(preorder)与后序(postorder) 

当前树的根在先序遍历中为第一个节点,即为pre[l1],在后序遍历中为最后一个节点,即为post[r2]
左子树根为先序遍历的根的后一个节点,即为pre[l1+1]
右子树根为后序遍历的根的前一个节点,即为post[r2-1]

node* create(int l1,int r1,int l2,int r2){//当前遍历的树的边界if(l1>r1||l2>r2)return new node(-1);node* nod=new node(pre[l1]);//先序遍历的第一个节点即为根节点//当前树的根在先序遍历中为第一个节点,即为pre[l1],在后序遍历中为最后一个节点,即为post[r2]//左子树根为先序遍历的根的后一个节点,即为pre[l1+1]//右子树根为后序遍历的根的前一个节点,即为post[r2-1]int left1,right1,left1,right2;//左子树的边界//先序遍历//左边界:l1+1left1=l1+1;//右边界:右子树根的前一个节点即为右边界for(right1=l1;right1<=r1;right1++){if(pre[right1+1]==post[r2-1])break;}//后序遍历//左边界:l2(后序遍历为左右根,第一个肯定是左子树的节点)left2=l2;//右边界:左子树根for(right2=l2;right2<=r2;right2++){if(post[right2]==pre[l1+1])break;}nod->l=create(left1,right1,left2,right2);//构建左子树//右子树边界//先序遍历//左边界:右子树根for(left1=l1;left1<=r1;left1++){if(pre[left1]==post[r2-1])break;}//右边界:r1right1=r1;//后序遍历//左边界:左根的后一个节点for(left2=l2;left2<=r2;left2++){if(post[left2-1]==pre[l1-1])break;}//右边界:r2-1;right2=r2-1;nod->r=create(left1,right1,left2,right2);//构建右子树return nod;
}

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

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

相关文章

DDR-MIG 学习记录

MIG调试总结&#xff1a; 对vivado软件中用于控制DDR2 / DDR3 的 控制器MIG(Memory Interface Generator)IP核进行了仿真测试&#xff0c;以学习如何用IP核来控制FPGA板载SDRAM的读写。我们只需要学会MIG的接口控制就可以。 ①配置IP核 Xilinx 的 DDR 控制器的名称简写为 MIG&…

brk和sbrk

在计算机程序中&#xff0c;“program break”通常指的是堆的当前内存边界。当我们改变堆的大小&#xff08;即分配或释放内存&#xff09;&#xff0c;其实就是在命令内核改变进程的“program break”位置。 最初&#xff0c;“program break”正好位于未初始化数据段(bss)末…

vue3中的动态component组件

is属性来指定要渲染的组件(填写组件名&#xff09; 多个子组件通过component标签挂载在同一个父组件中&#xff0c; 可以修改is属性进行动态切换组件。 可以搭配<keep-alive></keep-alive>使用。 父组件代码&#xff1a; <template><div style"fon…

2017年五一杯数学建模A题公交车排班问题解题全过程文档及程序

2017年五一杯数学建模 A题 公交车排班问题 原题再现 随着徐州市经济的快速发展&#xff0c;公交车系统对于人们的出行扮演着越来越重要的角色。在公交车资源有限的情况下&#xff0c;合理的编排公交车的行车计划成为公交公司亟待解决的问题。以下给出公交车排班问题中的部分名…

【NI-RIO入门】为CompactRIO供电

在大多数情况下&#xff0c;您可以使用可直接连接系统的电源&#xff0c;例如墙上的电源插座。但是&#xff0c;某些应用程序或环境缺乏可用电源&#xff0c;您必须使用其他电源&#xff0c;例如电池。无论您是否有可用电源&#xff0c;您可能都希望通过为系统提供一些冗余来确…

洛谷 P1605 USACO迷宫 (详细解析和AC代码)【深搜+打表】

P1605 迷宫 前言题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目分析注意事项 代码后话王婆卖瓜 题目来源 前言 没什么好说的深搜yyds&#xff01;直接深搜一遍过&#xff01; 题目 题目描述 给定一个 N M N \times M NM 方格的迷宫&#xff0c;迷…

python加速方法:GPU加速(numba库)Demo及编写注意事项

上周使用GPU加速了一个算法&#xff0c;效果特别惊艳&#xff0c;由于算法代码本身没有太大参考价值&#xff0c;所以这里只记录了一些心得体会&#xff0c;以便后续遇到问题进行参考排查 numba加速代码编写注意事项 numba加速代码编写一定要注意&#xff1a; 1、开辟空间&am…

【Java并发】聊聊不安全的HashMap以及ConcurrentHashMap

在实际的开发中&#xff0c;hashmap是比较常用的数据结构&#xff0c;如果所开发的系统并发量不高&#xff0c;那么没有问题&#xff0c;但是一旦系统的并发量增加一倍&#xff0c;那么就可能出现不可控的系统问题&#xff0c;所以在平时的开发中&#xff0c;我们除了需要考虑正…

Python从入门到精通(黑马课程)

目录 运算符 数字运算符 比较运算符 逻辑运算符 转义字符 变量使用 变量定义 变量类型 变量命名 变量函数 input函数 type函数 条件语句 If 格式 案例1&#xff0c;判断年龄 案例2&#xff0c;借钱 案例3&#xff0c;and、or应用 循环语句 for 格式 案例…

如何使用Cloudreve将个人电脑打造为私有云盘并实现远程访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 云存储概念兴起后&#xff0c;现在市面上也已经有了很多公有云盘。但一段时间后…

redis基本数据结构

Redis入门&#xff1a;五大数据类型 文章目录 Redis入门&#xff1a;五大数据类型一.概述二.Redis的基本了解三.Redis五大数据类型1.String (字符串)2.List(列表)3.Set集合(元素唯一不重复)4.Hash集合5.zSet(有序集合) 一.概述 什么是Redis Redis&#xff08;Remote Dictiona…

Java 之 lambda 表达式(一)

目录 一. 前言 二. lambda 表达式语法 2.1. 语法1&#xff1a;无参&#xff0c;无返回值 2.2. 语法2&#xff1a;一个参数&#xff0c;无返回值 2.3. 语法3&#xff1a;两个参数&#xff0c;lambda 体中有多条语句 2.4. 语法4&#xff1a;两个以上参数&#xff0c;有返回…

C++ STL-----容器

STL容器就是将运用最广泛的一些数据结构实现出来 常用的数据结构&#xff1a;数组, 链表,树, 栈, 队列, 集合, 映射表 等 这些容器分为序列式容器和关联式容器两种: 序列式容器:强调值的排序&#xff0c;序列式容器中的每个元素均有固定的位置。 关联式容器:二叉树结构&…

深入了解Java8新特性-日期时间API:LocalDateTime类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概22000多字&#xff0c;预计阅读时间长需要20分钟以上。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…

python fastapi模块使用

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;、基于标准 Python 类型提示的 Web 框架。它是一个用于构建 API 的异步框架&#xff0c;基于 Starlette 和 Pydantic 构建。以下是使用 FastAPI 的一些基本步骤&#xff1a; 安装 FastAPI 和 Uvicorn&#xff1a; pip i…

c++没有返回值的返回值

上面的函数search没有返回值,因为a不等于1,但是输出的时候会输出6.这恰巧是x的值,如果我们希望a不等于1时返回x,那么这种结果反而是正确的.有时候这种错误的代码可能产生正确的结果反而会加大debug难度 int search(int n) { 00007FF66DB723E0 mov dword ptr [rsp8],e…

简易版扫雷+代码分析

前言&#xff1a; 实验一个简易版的扫雷&#xff0c;也要两百来行的代码&#xff0c;因此为了代码整洁&#xff0c;维护起来方便&#xff0c;这里我们和前期实现的三子棋一样&#xff0c;也弄一个游戏的头文件game.h用来装各种头文件以及函数的声明以及宏定义、预处理信息&…

视频文件+EasyDarwin做摄像机模拟器模拟RTSP流很方便,还能做成系统服务,方法与流程

之前我看到过一家人工智能做算法的企业&#xff0c;用EasyDarwinFFMPEG做了一个摄像机的模拟器&#xff0c;方法大概是&#xff1a; 用ffmpeg读取mp4等类型的视频文件&#xff08;当然ffmpeg啥都能读取&#xff09;&#xff0c;再以RTSP协议的形式推送给EasyDarwin&#xff1b…

为IP地址申请SSL证书

SSL&#xff08;Secure Sockets Layer&#xff09;是一种网络协议&#xff0c;用于在浏览器与服务器之间建立安全、加密的连接。SSL证书是用于证明您的网站身份并启用HTTPS&#xff08;超文本传输安全协议&#xff09;的安全文件。这种协议可以确保用户与您的网站之间的所有通信…

统计学中两组数据如何进行差异性(相关性)分析?

变量说明&#xff1a; 在确定分析方法前&#xff0c;我们需要了解手中的数据类型&#xff0c;这是最基础也是有必要的&#xff0c;在所有的数据类型中&#xff0c;我们将数据类型分为分类变量也为定类变量和连续变量也称为定量变量&#xff0c;那么什么是定类变量&#xff1f;…