二叉树的四种遍历算法(结构体数组)

article/2025/10/8 18:03:59

一、二叉树的定义

        以字符串的形式定义一棵二叉树的先序序列,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。

例:ABDG##HI####CE#J##F##

对应的二叉树:

 思路讲解:

        想要遍历二叉树,首先我们需要知道该二叉树是什么样子的,一般来说画出二叉树需要二叉树的先序序列+中序序列或者后序序列+中序序列,这里由于‘#’代表该二叉树是空树,让我们能够根据给出的先序序列画出二叉树。

        (1)我们知道二叉树的先序遍历是根左右的顺序,所以A为整个树的根结点,B为A的左子树。B后面是D,不是‘#’,说明B在该子树中为根结点,D为B的左子树,同理,G为D的左子树。此时的画出的树应该是这样的:

         (2)接下来,G后面是‘#’,说明G没有左子树,这时已经遍历了G(根结点)以及它的左子树,由根左右的顺序,然后是它的右子树,下一个是‘#’,说明G既没有左子树,也没有右子树,为叶子结点。

        (3)向上回溯,发现D没有遍历右子树,填入H即为D的右子树,H为该子树的根结点,填入I为H的左子树,I后面有两个‘#’,说明I为叶子结点。

        重复(1)(2)(3)步骤,直到画出二叉树。

二、创建二叉树

1.定义结构体数组

const int max=10000;
struct tree
{char ch;int lch;int rch;
}datas[max];//这里直接定义了一个结构体数组,等价于struct tree datas[max]

2.创建二叉树

#include<iostream>
using namespace std;const int maxnum=1000;//在create_tree函数中需要用到的变量。
char ch;
int count=0;//为结点进行编号struct tree
{char ch;int lch;int rch;
}datas[maxnum];int create_tree(int num)
{cin>>ch;if(ch=='#'){num=0;return num;}else{count++;num=count;datas[num].ch=ch;datas[num].lch=0;//初始化结点的左右子树datas[num].rch=0;datas[num].lch=create_tree(num);datas[num].rch=create_tree(num);}return num;
}
int main()
{int root=create_tree(0);return 0;
}

三、遍历子树

1.先序遍历

        先序遍历遵循根左右的顺序。

void preorder(int a)
{if(!a){return;}cout<<datas[a].ch;preorder(datas[a].lch);preorder(datas[a].rch);
}

2.中序遍历

        中序遍历遵循左根右的顺序。

void inorder(int a)
{if(!a){return;}inorder(datas[a].lch);cout<<datas[a].ch;inorder(datas[a].rch);
}

3.后序遍历

        后序遍历遵循左右根的顺序。

void postorder(int a)
{if(!a){return;}postorder(datas[a].lch);postorder(datas[a].rch);cout<<datas[a].ch;
}

4.层次遍历

        层次遍历可以使用队列结构(先进先出的特点)来完成算法。

        1.初始化一个队列,根结点入队。

        2.当队列非空时,循环执行下列步骤,否则遍历结束。

        3.出队一个结点,并访问该结点。

        4.若该结点的左子树非空,则左子树入队。

        5.若该结点的右子树非空,则右子树入队。

void level_order(int x)
{char t;int s;queue<int> p;if(x)//if运行条件为x不等于0 {p.push(x);while(!p.empty()){s=p.front();p.pop();t=datas[s].ch;cout<<t;if(datas[s].lch!=0){p.push(datas[s].lch);}if(datas[s].rch!=0){p.push(datas[s].rch);}}		}
}

 四、完整代码

#include<iostream>
#include<queue>
using namespace std;const int maxnum=1000;
char ch;
int count=0;struct tree
{char ch;int lch;int rch;
}datas[maxnum];int create_tree(int num)
{cin>>ch;if(ch=='#'){num=0;return num;}else{count++;num=count;datas[num].ch=ch;datas[num].lch=0;datas[num].rch=0;datas[num].lch=create_tree(num);datas[num].rch=create_tree(num);}return num;
}void preorder(int a)
{if(!a){return;}cout<<datas[a].ch;preorder(datas[a].lch);preorder(datas[a].rch);
}void inorder(int a)
{if(!a){return;}inorder(datas[a].lch);cout<<datas[a].ch;inorder(datas[a].rch);
}void postorder(int a)
{if(!a){return;}postorder(datas[a].lch);postorder(datas[a].rch);cout<<datas[a].ch;
}void level_order(int x)
{char t;int s;queue<int> p;if(x)//if运行条件为x不等于0 {p.push(x);while(!p.empty()){s=p.front();p.pop();t=datas[s].ch;cout<<t;if(datas[s].lch!=0){p.push(datas[s].lch);}if(datas[s].rch!=0){p.push(datas[s].rch);}}		}
}int main()
{int root=create_tree(0);cout<<"二叉树的先序遍历序列:"<<endl;preorder(root);cout<<endl;cout<<"二叉树的中序遍历序列:"<<endl;inorder(root);cout<<endl;cout<<"二叉树的后序遍历序列:"<<endl;postorder(root);cout<<endl;cout<<"二叉树的层序遍历序列:"<<endl;level_order(root); return 0;
}


http://chatgpt.dhexx.cn/article/E84Ot2xY.shtml

相关文章

二叉树的四种遍历方式

概要 树本身是一种简单化的图 &#xff1b; DFS对应前中后序遍历&#xff0c;BFS对应层序遍历 二叉树结构 struct treenode {int val;treenode *left;treenode *right;treenode() : val(0), left(nullptr), right(nullptr) {}treenode(int x) : val(x), left(nullptr), right(n…

针对Linux学习,值得阅读的五本书籍,不看可能错失机会

今天为了总结一些可以帮助各位在学习过程中提供帮助的一些书籍。 一.鸟叔的私房菜&#xff1a; 本书是知名度颇高的Linux入门书《鸟哥的Linux私房菜基础学习篇》的新版,而详细地介绍了Linux操作系统。全书分为五部分;第一部分部分着重说明计算机的基础知识、Linux的学习方法&a…

从零开始学习Linux(一)关闭虚拟机系统

关闭系统&#xff0c;需要输入如下命令 poweroff然而&#xff0c;你只能得到如下反馈 -bash: poweroff:command not found此项错误是因为poweroff命令是一个系统管理命令。执行此项命令需要高级使用者特权。 因此&#xff0c;为了关闭系统&#xff0c;我们首先需要切换到root…

个人随笔/小白应该如何学习Linux,我的一些心得分享.

大家好&#xff0c;今天给大家分享一下0基础的人如何入门Linux&#xff0c;此文来源&#xff1a;我在上班的路上看到一篇文章&#xff0c;也是写的0基础的人如何学习Linux的文章。当时我在想&#xff0c;我写博文一年多&#xff0c;都是相关Linux及Python等技术的文章&#xff…

Linux学习路线

&#xfeff;&#xfeff; 关于 Linux Linux 因其开源&#xff0c;免费&#xff0c;可裁剪&#xff0c;被应用到很多领域&#xff0c;尤其是嵌入式设备上。 Android 系统内核也是基于 Linux 的。 另外还有各种服务器和工作站也是用的 Linux。 什么是嵌入式设备&#xff1f;…

为什么要学习 Linux ????

目前企业中大量的使用Linux作为服务器&#xff0c;在以后你们就业后&#xff0c;会发现web服务器Tomcat ,jobss这一类都是搭建在linux上面的&#xff0c;后面我们需要学习的数据库mysql &#xff0c; oracle &#xff0c;db2&#xff0c; 或者greenplum这一类的&#xff0c;在企…

Linux 学习路线图

1.应用场景 更加高效地学习并达到运用Linux. 2.学习/操作 linux运维学习需要分为四个阶段&#xff1a;初级入门、中级进阶、高级提升、资深方向细化。 第一阶段&#xff1a;初级入门 初级阶段需要把linux学习路线搞清楚&#xff0c;任何学习都是循序渐进的&#xff0c;所以学…

从零入门机器学习之Linux系统详解

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,科大讯飞比赛第三名,CCF比赛第四名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

为什么要学习Linux?

对于一些偶然接触到Linux的人来说&#xff0c;好奇是对于这个陌生名词的的第一印象。也许这个名字经常出现在你所使用的教科书上&#xff0c;或者是一些技术性的文章上&#xff0c;你却不知其意&#xff0c;此时这个名字再次出现&#xff0c;你就更是好奇了&#xff0c;Linux到…

Linux学习总结

课程&#xff1a;Linux操作系统与应用 参考书&#xff1a;Linux从入门到精通、unix环境高级编程 学习linux之前必须要做好心理准备&#xff1a; 第一&#xff0c;要明白学好linux不是一件一蹴而就的事&#xff0c;一定要能坚持使用它&#xff0c;特别是在使用初期&#xff0c…

你知道如何学习Linux吗?

说起Linux&#xff0c;业内人士或者经常玩电脑&#xff0c;对计算机比较精通的应该是比较熟悉的&#xff0c;Linux是一个开源的操作系统&#xff0c;由于其安全性高&#xff0c;完全免费&#xff0c;高效性&#xff0c;稳定等优点&#xff0c;越来越受大众的欢迎&#xff0c;就…

学习linux的感受

学习前要 1.安装虚拟机或者自己买个云服务器 下载centOs然后将镜像装入系统 2.装入之后在自己的电脑下载Xshell和Xbox 3在自己windows系统下运行cmd拼一下自己的虚拟机或服务器测试两个机子网络是否相通&#xff0c;如果相通即可用Xshell进行远程登陆 成果: 今天学了vim与vi&…

初学者如何系统性地学习Linux?

作为一个大一的同学&#xff0c;可以采取下面的步骤进行系统的学习Linux。 1、选择一个发行版&#xff1a;对于初学者&#xff0c;推荐使用Ubuntu或者Linux Mint。Ubuntu适合新手&#xff0c;使用广泛&#xff0c;社区活跃&#xff0c;遇到问题容易找到解决方案。虽然你觉得Ub…

如何学习Linux

热热热 一、Linux大致要学习那些内容 1、Linux下的基本操作命令 2、Linux的各种配置 环境变量、网络的配置、服务的配置----常规而重要 3、Linux下搭建各种开发环境 例如&#xff1a; Javaee、大数据、Python等 4、能够写一些基本的shell脚本&#xff0c;对Linux系统进…

QTP基本使用1

目录 一、功能自动化 1、测试过程 2、录制类型 二、QTP基本使用1 1、【录制】 2、【运行】 3、【例 -- 录制编写记事本】 4、【设置】 三、上午程序脚本 四、test -- project 的比较 五、QTP基本使用2 1、导出test文件 2、导入test文件 3、查看帮助文档 4、修改…

QTP 脚本语言编写入门到精通(一)

飞机订票登陆系统flight 一、编写用户登录测试用例。 二、直接编写脚本 ****************** SystemUtil.Run PathFinder.Locate("..\samples\flight\app\flight4a.exe"),"",PathFinder.Locate("..\samples\flight\app"),"open" Syst…

QTP工具简单操作使用说明

简介 QTP是QuickTest Professional 的简称&#xff0c;是一种自动化测试工具。使用QTP的目的是用它来执行重复的手动测试&#xff0c;主要用于回归测试和测试同一软件的新版本&#xff08;版本迭代&#xff09;。 启动QuickTest 第一次启动QuickTest时&#xff0c;打开“加载…

qt完整教程

各个组件的意思(功能介绍) Python Qt GUI设计:UI界面可视化组件、属性概述(基础篇—3)-腾讯云开发者社区-腾讯云 qt 如何设计好布局和漂亮的界面。_qt界面_花狗Fdog的博客-CSDN博客 样式表(美化关键)/*灰色*/ Q/*灰色*/ QWidget {background-color: rgb(255, 182, …

QT5教程推荐

学完《C Primer》该学什么&#xff1f;《Qt 5.9 C开发指南》是一个不错的选择。两本书结合是C岗位就业的保障。Qt的书籍很多&#xff0c;推荐这一本是因为更接近实战&#xff08;工作内容&#xff09;。理论和实际结合的很好。虽然Qt6.x已经问世&#xff0c;但学习Qt5.9并不过时…

qtp11安装及入门

一、简介 QTP是Quick Test Professional的简称&#xff0c;是一种自动测试工具。使用QTP的目的是想用它来执行重复的自动化测试&#xff0c;主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试&#xff0c;例如要测试哪些功能、操作步骤…