【算法模板】二叉树的三种遍历方式,以及根据两种遍历方式建树

二叉树遍历与递归详解:从建树到BST判定的完整学习路径 在数据结构与算法的学习旅程中,线性结构如数组和链表往往容易理解,而二叉树作为首个引入分叉与递归思想的非线性结构,常成为初学者的分水岭。本文从二叉树节点的定义与层序建树出发,系统讲解前序、中序、后序及层序遍历的递归模板与迭代改造,深入剖析最大深度、最小深度以及平衡树判定中的边界陷阱。同时,针对搜索二叉树(BST)的合法性判定,指出只比较当前节点左右孩子的常见误区,并给出基于值域递归的严谨解法。此外,文章还区分了满二叉树与完全二叉树的概念,并分享了实际刷题过程中遇到的空指针、闭包变量作用域、递归顺序等真实排错经 阅读详情

前言:今年九月份的PAT考试就栽在这“两种遍历建树”上了,刚好没看,刚好考到。作为自己的遗憾,今日码完,贴在这里留个纪念,希望能给自己警醒与警钟。

简要概括:

1、二叉树的三种遍历方式分别是 先序(先根)遍历PreOrder,中序(中根)遍历InOrder,后序(后根)遍历PostOrder  。它们的递归写法相当简单,唯一要注意的是,递归的终止条件别忘了写; 至于非递归写法,写法比较麻烦,但是不会爆栈,先不写了。

2、如果已经知道二叉树的 PreOrder + InOrder ,或者是 PostOrder + InOrder ,就可以唯一确定出二叉树的样子并加以建树。建树的要点,以 PreOrder + InOrder 为例:先序遍历可以反映根的位置(首个即为根),中根遍历可以反映左右子树的范围,那么递归下去——由先序遍历确定根字符,在中序遍历中确定根字符位置,则根字符左侧为左子树,右侧为右子树,递归区间即可。

接下来代码为,输入两种遍历,程序会先进行建树,再通过遍历的方式,输出遍历的结果。观察遍历与输入的结果,可以得到程序的建树以及遍历算法,皆为正确。

#include<bits/stdc++.h>
using namespace std;
#define inf 999
char A[inf],B[inf];//A是PreOrder或者是PostOrder,B是InOrder
int n;

struct Node//节点
{
    char c;
    Node *left,*right;
    Node(char t)
    {
        c=t;
    }
};
void Input()//输入两种遍历方式,后序遍历后输入
{
    scanf("%s%s",A,B);
}

//l1,r1是A的区间;l2,r2是B的区间
Node* PreInCreate(int l1,int r1,int l2,int r2)//根据先序以及中序遍历建树
{
    if(l2>r2)return NULL;//要根据中序序列l1,r2而不是l1,r1,来判断是否有无左右子树
    Node *root=new Node(A[l1]);//确定当前的根,必然是先序序列的下一个字符
    int i;
    for(i=l2;B[i]!=A[l1];i++);//确定根在中序序列位置
    int llen=i-l2;//计算左子树的长度
    root->left=PreInCreate(l1+1,l1+llen,l2,i-1);//左子树
    root->right=PreInCreate(l1+llen+1,r1,i+1,r2);//右子树
    return root;//别忘记返回节点
}

/*教科书上写法的先序和中序转树,也是正确的
//l1,r1是A的区间;l2,r2是B的区间,
Node* PreInCreate(int l1,int r1,int l2,int r2)
{
    Node *root=new Node(A[l1]);
    int i;
    for(i=l2;B[i]!=A[l1];i++);//要根据中序序列l1,r2而不是l1,r1,来判断是否有无左右子树
    int llen=i-l2;//计算左子树的长度
    int rlen=r2-i;//计算右子树的长度
    if(llen)//左子树
        root->left=PreInCreate(l1+1,l1+llen,l2,i-1);
    else root->left=NULL;  //教科书喜欢把判断放在函数中,我个人喜欢把剪枝和终止放在函数头
    if(rlen)//右子树
        root->right=PreInCreate(l1+llen+1,r1,i+1,r2);
    else root->right=NULL;
    return root;//别忘记返回节点
}
*/

//l1,r1是A的区间;l2,r2是B的区间
Node* PostInCreate(int l1,int r1,int l2,int r2)//根据后序以及中序遍历建树
{
    if(l2>r2)return NULL;//要根据中序序列l1,r2而不是l1,r1,来判断是否有无左右子树
    Node *root=new Node(A[r1]);//确定当前的根,必然是后序序列的最后一个字符
    int i;
    for(i=l2;B[i]!=A[r1];i++);//要根据中序序列l1,r2而不是l1,r1,来判断是否有无左右子树
    int llen=i-l2;//计算左子树的长度
    root->left=PostInCreate(l1,l1+llen-1,l2,i-1);//左子树
    root->right=PostInCreate(l1+llen,r1-1,i+1,r2);//右子树
    return root;//别忘记返回节点
}
void PreTravse(Node *root)//先序遍历,根左右
{
    if(root==NULL)return;
    printf("%c",root->c);//根
    PreTravse(root->left);//左
    PreTravse(root->right);//右
}
void InTravse(Node *root)//中序遍历,左根右
{
    if(root==NULL)return;
    InTravse(root->left);//左
    printf("%c",root->c);//根
    InTravse(root->right);//右
}
void PostTravse(Node *root)//后序遍历,左右根
{
    if(root==NULL)return;
    PostTravse(root->left);//左
    PostTravse(root->right);//右
    printf("%c",root->c);//根
}
int main()
{
    Node *root=NULL;
    Input();
    printf("len :");//长度
    scanf("%d",&n);
    printf("mode :");//0为先序,1为后序
    int tag;
    scanf("%d",&tag);
    printf("\n");
    if(tag==0)
    {
        root=PreInCreate(0,n-1,0,n-1);
        printf("the output is \n");
        PreTravse(root);
        printf("\n");
        InTravse(root);
        printf("\n");
    }
    else
    {
        root=PostInCreate(0,n-1,0,n-1);
        printf("the output is \n");
        PostTravse(root);
        printf("\n");
        InTravse(root);
        printf("\n");
    }
    return 0;
}

测试数据:

先序中序建树:

ABCDEFGHI

BCAEDGHFI

9

0

后序中序建树:

CBEHGIFDA

BCAEDGHFI

9

1

运行效果图:

也希望能给别人带来收获啦~!

晶圆测试(wafer sort)全流程解析:从探针卡到良率统计的实战指南 本文详细解析了晶圆测试(wafer sort)的全流程,从探针卡选型到良率统计的实战指南。涵盖了12英寸先进制程产线的关键技术,包括探针卡系统、测试程序开发、产线自动化集成及数据分析,特别聚焦多站点并行测试的时序优化和接触阻抗异常排查,帮助工程师提升测试效率与准确性。 阅读详情

相关推荐

AI应用安全 - Prompt注入攻击

随着大模型的爆火,各行各业都在使用大模型进行智能化改造。但是如何做一个可靠的大模型应用,就需要考虑各种安全问题。本文主要介绍一种常见的安全问题,即prompt注入攻击,并介绍一些防范手段。Prompt Injection Attack(提示注入攻击)是针对大型语言模型(LLM)的一种新兴安全威胁,攻击者通过精心构造的输入提示(prompt)来操纵模型行为,使其产生非预期输出或执行恶意操作。它主要包括两种注入方式,一是直接注入,而是间接注入。

sinat_28694519的博客 1932

根据先序遍历和中序遍历建立二叉树

title: 根据先序遍历和中序遍历建立二叉树 date: 2019-07-23 22:37:34 tags: 数据结构 问题 已知一棵二叉树的先序遍历以及中序遍历,重建二叉树。二叉树的每一个节点有三个属性,左子节点,右子节点,以及节点值。 思路 先序遍历服从规则“根左右”,所以由此可知,对于一个先序遍历得到的数组,第一个元素一定是根节点; 中序遍历服从规则...

weixin_30314793的博客 1083

2023-12-26~2025-07-04备份

一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。

青铜小码农 3126

二叉树的建立,遍历,销毁(C语言)

【代码】二叉树的建立,遍历,销毁(C语言)

m0_74824254的博客 234

深入解析DisplayPort(DP)接口:从主链路到辅助通道的全方位技术剖析

本文深入解析DisplayPort(DP)接口的核心技术架构,重点剖析了其三大功能模块:承载视频/音频数据洪流的Main-Link主链路、负责链路训练与设备控制的AUX CH辅助通道,以及实现智能交互的HPD热插拔检测。文章详细阐述了主链路的可伸缩Lane配置、嵌入式时钟与数据成帧机制,以及辅助通道在设备发现、动态优化信号质量(链路训练)中的关键作用,揭示了DP接口实现高效率与灵活性的设计哲学。

weixin_29267307的博客 485

单窗算法的地表温度反演:谷歌地球引擎GEE代码

该论文基于Statistical Mono-Window(SMW)算法,对地表温度加以求解。其中,简单地说,SMW算法即是通过简单的线性关系,对由单热红外波段所得的大气表观亮温与地表温度之间的经验关系加以表示,从而计算得到LST。

2301_78834737的博客 552

通过遍历序列构造二叉树(扩展二叉树的先序、先序和中序、后序和中序、层序和中序)附可执行完整代码

文章目录二叉树的构造扩展二叉树的先序遍历序列构造二叉树后序遍历序列和中序遍历序列构造二叉树层序遍历序列和中序遍历序列构造二叉树层序遍历序列和中序遍历序列构造二叉树 二叉树的构造  可以构建一棵二叉树的几个方法: 扩展二叉树的先序遍历序列 前序遍历序列和中序遍历序列 后序遍历序列和中序遍历序列 层序遍历序列和中序遍历序列  注意,只有前序遍历序列和后序遍历序列是不能唯一的确定一棵二叉树的。 扩展二叉树的先序遍历序列构造二叉树 题目描述:  在二叉树的所有空指针位置加入虚拟结点,就构成扩展二叉树。二叉树原

薛定谔的猫的博客 6426

整合Springboot+MybatisPlus+达梦数据库

整合Springboot+MybatisPlus+达梦数据库,以及一些坑

波波的博客 6677

常用遍历二叉树算法和LeetCode题实战汇总

目录 二叉链表存储二叉树 前序遍历 中序遍历 后序遍历 层序遍历 由遍历手段确定二叉树 小试牛刀:LeetCode最大层内元素和 二叉链表存储二叉树 typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; 后面就直接用了 前序遍历 规则: 如果...

沉迷单车的追风少年 1129

q-learning精讲

Q-learning Q-learning是一种用于机器学习的强化学习技术。 Q-learning的目标是学习一种策略,告诉Agent在什么情况下要采取什么行动。 它不需要环境模型,可以处理随机转换和奖励的问题,而无需进行调整。 对于任何有限马尔可夫决策过程(FMDP),Q学习找到一种最优的策略,即从当前状态开始,它在任何和所有后续步骤中最大化总奖励的预期值。在给定无限探索时间和部分随机策略的情况...

weixin_41697507的博客 1万+

【AI智能体】Spring AI Tool 从使用到实战详解

Spring AI Tool

congge 5864

数据结构C语言树的遍历pta,PTA 二叉树的三种遍历(先序、中序和后序)

本题要求实现给定的二叉树的三种遍历。函数接口定义:void Preorder(BiTree T);void Inorder(BiTree T);void Postorder(BiTree T);T是二叉树树根指针,Preorder、Inorder和Postorder分别输出给定二叉树的先序、中序和后序遍历序列,格式为一个空格跟着一个字符。其中BinTree结构定义如下:typedef char E...

weixin_36365795的博客 1806

【Bug已解决】Codex Desktop 更新后无法启动/闪退解决方案

方案适用场景推荐指数清理本地缓存重启最常见、最应优先尝试的方案⭐⭐⭐⭐⭐完全卸载重装缓存清理无效时的进阶方案⭐⭐⭐⭐详细日志定位崩溃环节需要精确诊断问题原因⭐⭐⭐⭐锁定旧稳定版本确认是特定版本缺陷时的过渡方案⭐⭐⭐反馈官方支持团队自助方式无效时的最终途径⭐⭐⭐⭐Codex Desktop 更新后无法启动/闪退的本质通常是新版本程序在启动时读取到了旧版本遗留的、格式不兼容的本地缓存或配置数据,导致启动流程中途崩溃。

一键难忘的博客 6285

二叉树——根据先序(后序)、中序 建树,超详讲解。

先中和后中的思路相同,这里先以先中举例: 思路:通过递归,不断压缩中序和先序序列的长度,从而确定左右子树。 根据先序排列的性质,第一个数则是这个序列中所有点的根节点root。确定通过map数组确定该点在中序序列中的位置k。 ...

Mr_dimple的博客 3万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

二叉树的遍历模板(建树已知两者求其他)

【代码】二叉树的遍历模板(建树已知两者求其他)

2301_80882026的博客 376

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【算法竞赛模板】二叉树专题(含前中后序遍历建树、DFS与BFS等对二叉树的操作)

二叉树算法模板专题,通过前中后序遍历来构建二叉树,同时含有非递归的前中后序遍历树,在二叉树中常见运用DFS或者BFS解决的问题场景

不负AC不负卿的博客 1405

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

二叉树各种遍历的结合模板

二叉树各种遍历模板 以下代码假设输入的是先序遍历和中序遍历输出后序遍历 测试用例 3 1 2 3 2 1 3 2 3 1 7 1 2 4 6 5 7 3 6 4 2 5 7 1 3 6 4 7 5 2 3 1 先序遍历 + 中序遍历 = 后序遍历 仅要求输出序列 如果改成后序遍历和中序遍历输出先序遍历,只需要把遍历中的root改成后序遍历中最后一个数字即可 #include <iostream> #include <vector> using namespace std; i

weixin_44535077的博客 1026

SJTU中后序遍历建树求前序

中后序遍历建树求前序 【问题描述】 给定二叉树节点个数以及其中序遍历和后序遍历,求其前序遍历。 【输入形式】 共三行。 第一行是一个正整数N,表示节点个数。 第二行共N个正整数,表示二叉树的中序遍历。 第三行共N个正整数,表示二叉树的后序遍历。 【输出形式】 共一行,输出前序遍历。 【样例输入】 10 3 6 7 4 5 9 10 2 8 1 3 7 6 5 10 9 4 8 1 2 【样例输出】...

weixin_44731499的博客 412

UVa 548 Tree【根据遍历序列建二叉树模板】

参考紫书代码,作为根据遍历序列建树的模板掌握起来。 代码是中后序建树,先中序建树一样,只需要稍微改动一下就行了 建树部分: //把in_order[L1...R1]和post_order[L2...R2]建成一棵二叉树,返回树根 //其实是个找根然后划分左右子树继续找根的递归过程 int build(int L1,int R1,int L2,int R2){ if(L1>R1) re...

之虎者也的博客 185

python构建二叉树_Python 二叉树的层序建立与三种遍历实现详解

分享二叉树的建立例题,以及三种遍历首先不要从网上复制,再就是最好是自己编的,最重要的是二叉树的建立,/* bu用递归法输出中序和后续*/ #include "stdio.h" #include "stdlib.h" #define A 25 typedef struct Btree { char data; struct Btree *lchild,*rchild; }*tree,t2ree; t...

weixin_39882870的博客 418

二叉树的构建与遍历(链表法)

二叉树作为基础数据结构,其构建与遍历可以说是一名程序员的基本功,更是一名ACMer的应烂熟于心的知识。 我们以一道题为例,来讲解二叉树的构建与遍历。 【问题描述】 根据输入提示,构建二叉树。本题目中,对所有节点进行编号 【输入形式】 第一行整数m,表示二叉树中共有m个非空节点 第二行m个整数,表示编号节点对应的value值,编号从1到m 后面一共m行,表示编号节点的左右子节

优快云_Fnoily的博客 1006

二叉树的遍历(递归,迭代,Mirrors)详解

文章目录二叉树的遍历算法分为三种创建二叉树递归先序遍历中序遍历后序遍历迭代先序遍历先序走流程代码实现中序遍历举例说明流程代码实现后序遍历思路一:两个栈搞定版举例说明代码实现思路二:一个栈搞定版举例说明:代码实现Mirrors遍历Mirrors核心思想Mirrors遍历的模板代码先序遍历按照例子走流程代码实现中序遍历按照例子走流程代码实现后序遍历按照例子走流程代码实现: 二叉树的遍历算法分为三种  1. 递归  2. 迭代  3. Mirrors遍历 本文主要讲述Mirror遍历与迭代算法,递归算法很简单,不

闭上眼 待琉璃 的博客 1434

[模板] 二叉树 由先序遍历和中序遍历建树 & 蓝桥杯练习系统 试题 绘制地图

蓝桥杯练习系统 试题 算法训练 绘制地图 蓝桥杯练习系统 试题 算法训练 绘制地图 资源限制 时间限制:1.0s 内存限制:256.0MB 关于二叉树: 【模板】 二叉树_WalkingSeason的博客 问题描述   最近,WYF正准备参观他的点卡工厂。WYF集团的经理氰垃圾需要帮助WYF设计参“观”路线。现在,氰垃圾知道一下几件事情: WYF的点卡工厂构成一颗二叉树。 一共有n座工厂。 他需要把这颗树上的点以后序遍历的方法列出来,才能绘制地图。   还好,最近他的属下给了他先序遍历和中序遍历的数据

qq_16544311的博客 322

根据先序中序遍历建树【模板】

主要就是通过先序找到当前子树根节点,再用中序遍历分子树,不断递归下去。#include <iostream> #include <stdio.h> #include <cstring> #include <vector> #include <cmath> #include <algorithm> #include <set> #include <cassert> #include <time.h>

This is bill的专属博客 3284

数据结构——二叉树建树与遍历

从mooc上看到一张很好的图,说明了前序遍历,中序遍历,后序遍历之间的关系。(1)先序遍历 如果二叉树不为空,访问根节点,前序遍历左子树,前序遍历右子树,如上图×号。//先序遍历 void PreOrderTree(BinTreeNode *root) { if(root) { cout<<root->data<<" "; PreOrderTree(

ZHangFFYY的博客 847

二叉树算法精讲:遍历、构造与优化策略

二叉树作为基础数据结构,在算法面试和工程实践中占据重要地位。其核心在于理解节点间的层级关系与递归逻辑,通过前序、中序、后序等遍历方式实现数据访问。在实际应用中,递归解法虽然简洁,但需要注意栈溢出风险;迭代解法则通过显式维护栈/队列结构提升时空效率。针对完全二叉树等特殊结构,可以采用数组存储优化访问性能。在算法题中,二叉树问题主要涉及遍历、构造、属性判断等维度,掌握Morris遍历等优化技巧能有效提升处理效率。这些技术广泛应用于数据库索引、文件系统等场景,是提升程序性能的关键手段。

weixin_34221654的博客 301
上一篇: 爆刷PAT(甲级)——之【1118】 Birds in Forest(25 分)——并查集赤裸模板题
下一篇: 【心随意动】2019年考研落榜失败总结
仰天倀笑
博客等级 码龄10年 313粉丝 124原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值