数据结构项目——二叉树实现

数据结构项目——二叉树实现案例分析:写出下面二叉树的先、中、后序遍历输出的结果:注:先自己推算,然后用程序验算。先序遍历的结果:A F H D C B J G E I K中序遍历的结果:D H C F J B G A I E K后序遍历的结果:D C H J G B F I K E A代码如下:#include “pch.h”#include &…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

案例分析:

写出下面二叉树的先、中、后序遍历输出的结果:
注:先自己推算,然后用程序验算。

在这里插入图片描述
先序遍历的结果:A F H D C B J G E I K
中序遍历的结果:D H C F J B G A I E K
后序遍历的结果:D C H J G B F I K E A

代码如下:

#include "pch.h"
#include <iostream>
using namespace std;
int top = -1;
typedef struct Bitnode
{ 

char data;
Bitnode *lchild, *rchild;
}Bitnode,*bittree;
//创建一个二叉树
void Createbittree(bittree *t)
{ 

*t =(Bitnode *) malloc(sizeof(Bitnode));
(*t)->data = 'A';
(*t)->lchild= (Bitnode *)malloc(sizeof(Bitnode));
(*t)->rchild =(Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->data = 'F';
(*t)->rchild->data = 'E';
(*t)->lchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->rchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->rchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->lchild->data = 'H';
(*t)->lchild->rchild->data = 'B';
(*t)->rchild->lchild->data = 'I';
(*t)->rchild->rchild->data = 'K';
(*t)->rchild->lchild->lchild= NULL;
(*t)->rchild->lchild->rchild= NULL;
(*t)->rchild->rchild->lchild = NULL;
(*t)->rchild->rchild->rchild = NULL;
(*t)->lchild->lchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->lchild->lchild->lchild = NULL;
(*t)->lchild->lchild->lchild->rchild = NULL;
(*t)->lchild->lchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->lchild->rchild->lchild = NULL;
(*t)->lchild->lchild->rchild->rchild = NULL;
(*t)->lchild->rchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->rchild->lchild->lchild = NULL;
(*t)->lchild->rchild->lchild->rchild = NULL;
(*t)->lchild->rchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->rchild->rchild->lchild = NULL;
(*t)->lchild->rchild->rchild->rchild = NULL;
(*t)->lchild->lchild->lchild->data = 'D';
(*t)->lchild->lchild->rchild->data = 'C';
(*t)->lchild->rchild->lchild->data = 'J';
(*t)->lchild->rchild->rchild->data = 'G';
}
//先序遍历入栈
void Push(Bitnode **a,Bitnode *elem)
{ 

a[++top] = elem;
}
//先序遍历出栈
void Pop()
{ 

if (top==-1)
{ 

return;
}
top--;
}
//获取栈顶元素
Bitnode *Get_top(Bitnode**a)
{ 

return a[top];
}
//输出节点数据
void Printelem(Bitnode *elem)
{ 

cout << elem->data << " ";
}
//实现先序遍历算法
void preorder(Bitnode*tree)
{ 

Bitnode *a[30];
Bitnode *p;
Push(a, tree);
while (top!=-1)
{ 

p = Get_top(a);
Pop();
while (p)
{ 

Printelem(p);
if (p->rchild)
{ 

Push(a,p->rchild);
}
p = p->lchild;
}
}
}
//中序遍历二叉树
void inorder(bittree tree)
{ 

Bitnode *a[30];	//定义一个顺序栈
Bitnode *p;		//临时指针
Push(a, tree);	//根节点入栈
while (top != -1)	//top!=-1来判定栈是否为空
{ 

while ((p=Get_top(a))&&p)//获取栈顶元素不为空
{ 

//左子树节点入栈,如果没有,null入栈
Push(a, p->lchild);
}
Pop();//跳出循环,栈顶元素是空,
if (top!=-1)
{ 

p = Get_top(a);//获取栈顶元素
Pop();
Printelem(p);
Push(a,p->rchild);//右子树节点入栈
}
}
}
//二叉树后序遍历(非递归法)
struct Snode
{ 

bittree p;
int tag;
};
//后序遍历的入栈函数
void PostPush(Snode*a, Snode sdata)
{ 

a[++top] = sdata;
}
//后序遍历
void PostOrder(bittree tree)
{ 

Snode a[20];
Bitnode*p;		//节点指针
int tag;
Snode sdata;
p = tree;
while (p||top!=-1)//用的或,这两种都行
{ 

while (p)
{ 

sdata.p = p;
sdata.tag = 0;//遍历左子树,设置标记位为0
PostPush(a, sdata);//入栈
p = p->lchild;//以该节点为根节点,遍历左子树
}
sdata=a[top];
Pop();
p = sdata.p;
tag = sdata.tag;
if (tag==0)//条件为真,左子树遍历完成,该节点需要遍历右子树
{ 

sdata.p = p;
sdata.tag = 1;
PostPush(a, sdata);//更改节点标志位,重新入栈
p = p->rchild;//将该节点的右子树设置为根节点,重新循环
}
else
{ 

Printelem(p);
p = NULL;
}
}
}
int main()
{ 

bittree tree;
Createbittree(&tree);
cout << "先序遍历的结果为:";
preorder(tree);
cout << endl;
cout << "中序遍历的结果为:";
inorder(tree);
cout << endl;
cout << "后序遍历的结果为:";
PostOrder(tree);
cout << endl;
return 0;
}

结果为:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170980.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 为joomla加入�下拉菜单的方法

    为joomla加入�下拉菜单的方法

  • 此工作站和主域直接信任失败_此域与工作站信任失效

    此工作站和主域直接信任失败_此域与工作站信任失效当您登录到域环境中运行Windows7的计算机上时,您会收到以下错误消息:此工作站和主域之间的信任关系失败。解决方案若要解决此问题,请从域中删除计算机,然后将计算机连接到域。若要执行此操作,请执行以下步骤:使用本地管理员帐户登录到计算机上。单击开始,右键单击计算机,然后单击属性。单击计算机名称旁边的更改设置。在计算机名选项卡上,单击更改。在

    2022年10月18日
  • [转]搭建Windows下Java Web开发环境

    [转]搭建Windows下Java Web开发环境

  • java 时间字符串 转换_java实现时间与字符串之间转换

    java 时间字符串 转换_java实现时间与字符串之间转换导读正文本文实例为大家分享了java实现时间与字符串之间转换的具体代码,供大家参考,具体内容如下1.long字符串转换成yyyy-MM-ddHH:mm:ss格式输出importjava.text.SimpleDateFormat;importjava.util.Date;//将long字符串转换成格式时间输出publicclassLongToString{publicstatic…

  • hbase splits_hbase shell scan

    hbase splits_hbase shell scan1Region拆分一个Region代表一个表的一段Rowkey的数据集合,当Region太大,Master会将其拆分。Region太大会导致读取效率太低,遍历时间太长,通过将大数据拆分到不同机器上,分别查询再聚合,Hbase也被人称为“一个会自动分片的数据库”。Region可以手动和自动拆分。1.1Region自动拆分1.1.1ConstantSizeRegionSplitPo…

  • 汉语拼音发音教学视频_钢琴手把手教学视频

    汉语拼音发音教学视频_钢琴手把手教学视频pycharm汉化pycharm怎么改成汉语,手把手教学,超详细(汉语插件安装教程)首先,打开pycharm。然后点击左上角File(文件)会弹出如下页面继续点击蓝色位置Settings…(设置)会弹出一个页面如下:继续点击蓝色位置Plugins(插件)在搜索栏中输入chinese,如图然后安装第二个(可以滑动找一下),点击Install(安装),会加载一下下载进度条,然后变成这样:安装之后点击绿色按钮RestartIDE,会弹出点击蓝色按钮Restart,然后pycharm会重启,重启后

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号