问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

用二叉树先序遍历算法创建一组数据构成的二叉树排序

发布网友 发布时间:2022-05-12 21:01

我来回答

2个回答

热心网友 时间:2022-04-26 19:01

这是我刚做好的,你下载一个dev-cpp软件,把这个复制进去编译就行了。
数据结构课程设计源程序
注:main函数在最后,这样编译时就不用声明其他要用的函数。

#include<stdio.h>
#include<malloc.h>
#include<math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status ;
//函数状态类型
typedef int ElemType ;
//二叉树结点数据类型为整型
#define FORMAT "%d "
//输出格式与ElemType对应

void RandomHundred(int ran[100])
//产生100个不大于100且各不相同的整数,存放在ran[100]中
{int i,temp,ransubscript ;
//temp用于交换,ransubscript为随机下标
for(i=1;i<101;++i)ran[i-1]=i ;
//先把1-100按顺序放入数组中
for(i=100;i>0;--i)
{ransubscript=rand()%i ;
//产生随机下标
temp=ran[i-1];
ran[i-1]=ran[ransubscript];
ran[ransubscript]=temp ;
//交换ran[i-1]与ran[ransubscript]}}
typedef struct BSTNode
{ElemType data ;
int bf ;
/*结点的平衡因子*/
struct BSTNode*lchild,*rchild ;
/* 左、右孩子指针 */}BSTNode,*BSTree ;
#define EQ(a,b)((a)==(b))
#define LT(a,b)((a)<(b))
#define LH +1 /* 左高 */
#define EH 0 /* 等高 */
#define RH -1 /* 右高 */
void R_Rotate(BSTree*p)
{/* 对以*p为根的二叉排序树作右旋处理,处理之后p指向新的树根结点,即旋转 */
/* 处理之前的左子树的根结点。算法9.9 */
BSTree lc ;
lc=(*p)->lchild ;
/* lc指向p的左子树根结点 */
(*p)->lchild=lc->rchild ;
/* lc的右子树挂接为p的左子树 */
lc->rchild=*p ;
*p=lc ;
/* p指向新的根结点 */}

void L_Rotate(BSTree*p)
{/* 对以*p为根的二叉排序树作左旋处理,处理之后p指向新的树根结点,即旋转 */
/* 处理之前的右子树的根结点。算法9.10 */
BSTree rc ;
rc=(*p)->rchild ;
/* rc指向p的右子树根结点 */
(*p)->rchild=rc->lchild ;
/* rc的左子树挂接为p的右子树 */
rc->lchild=*p ;
*p=rc ;
/* p指向新的根结点 */}

void LeftBalance(BSTree*T)
{/* 对以指针T所指结点为根的二叉树作左平衡旋转处理,本算法结束时, */
/* 指针T指向新的根结点。算法9.12 */
BSTree lc,rd ;
lc=(*T)->lchild ;
/* lc指向*T的左子树根结点 */
switch(lc->bf)
{ /* 检查*T的左子树的平衡度,并作相应平衡处理 */
case LH :
/* 新结点插入在*T的左孩子的左子树上,要作单右旋处理 */
(*T)->bf=lc->bf=EH ;
R_Rotate(T);
break ;
case RH :
/* 新结点插入在*T的左孩子的右子树上,要作双旋处理 */
rd=lc->rchild ;
/* rd指向*T的左孩子的右子树根 */
switch(rd->bf)
{ /* 修改*T及其左孩子的平衡因子 */
case LH :
(*T)->bf=RH ;
lc->bf=EH ;
break ;
case EH :
(*T)->bf=lc->bf=EH ;
break ;
case RH :
(*T)->bf=EH ;
lc->bf=LH ;
break ;}
rd->bf=EH ;
L_Rotate(&(*T)->lchild);
/* 对*T的左子树作左旋平衡处理 */
R_Rotate(T);
/* 对*T作右旋平衡处理 * }}

void RightBalance(BSTree*T)
{/* 对以指针T所指结点为根的二叉树作右平衡旋转处理,本算法结束时, */
/* 指针T指向新的根结点 */
BSTree rc,rd ;
rc=(*T)->rchild ;
/* rc指向*T的右子树根结点 */
switch(rc->bf)
{/* 检查*T的右子树的平衡度,并作相应平衡处理 */
case RH :
/* 新结点插入在*T的右孩子的右子树上,要作单左旋处理 */
(*T)->bf=rc->bf=EH ;
L_Rotate(T);
break ;
case LH :
/* 新结点插入在*T的右孩子的左子树上,要作双旋处理 */
rd=rc->lchild ;
/* rd指向*T的右孩子的左子树根 */
switch(rd->bf)
{/* 修改*T及其右孩子的平衡因子 */
case RH :
(*T)->bf=LH ;
rc->bf=EH ;
break ;
case EH :
(*T)->bf=rc->bf=EH ;
break ;
case LH :
(*T)->bf=EH ;
rc->bf=RH ;
break ;}
rd->bf=EH ;
R_Rotate(&(*T)->rchild);
/* 对*T的右子树作右旋平衡处理 */
L_Rotate(T);
/* 对*T作左旋平衡处理 */}}

Status InsertAVL(BSTree*T,ElemType e,Status*taller)
{/* 若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个 */
/* 数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树 */
/* 失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。算法9.11 */
if(!*T)
{/* 插入新结点,树“长高”,置taller为TRUE */
*T=(BSTree)malloc(sizeof(BSTNode));
(*T)->data=e ;
(*T)->lchild=(*T)->rchild=NULL ;
(*T)->bf=EH ;
*taller=TRUE ;}
else
{if(EQ(e,(*T)->data))
{/* 树中已存在和e有相同关键字的结点则不再插入 */
*taller=FALSE ;
return FALSE ;}
if(LT(e,(*T)->data))
{/* 应继续在*T的左子树中进行搜索 */
/* 未插入 */
if(!InsertAVL(&(*T)->lchild,e,taller))return FALSE ;
/* 已插入到*T的左子树中且左子树“长高” */
/* 检查*T的平衡度 */
if(*taller)switch((*T)->bf)
{case LH :
/* 原本左子树比右子树高,需要作左平衡处理 */
LeftBalance(T);
*taller=FALSE ;
break ;
case EH :
/* 原本左、右子树等高,现因左子树增高而使树增高 */
(*T)->bf=LH ;
*taller=TRUE ;
break ;
case RH :
(*T)->bf=EH ;
/* 原本右子树比左子树高,现左、右子树等高 */
*taller=FALSE ;}}
else
{/* 应继续在*T的右子树中进行搜索 */
/* 未插入 */
if(!InsertAVL(&(*T)->rchild,e,taller))return FALSE ;
/* 已插入到T的右子树且右子树“长高” */
/* 检查T的平衡度 */
if(*taller)switch((*T)->bf)
{case LH :
(*T)->bf=EH ;
/* 原本左子树比右子树高,现左、右子树等高 */
*taller=FALSE ;
break ;
case EH :
/* 原本左、右子树等高,现因右子树增高而使树增高 */
(*T)->bf=RH ;
*taller=TRUE ;
break ;
case RH :
/* 原本右子树比左子树高,需要作右平衡处理 */
RightBalance(T);
*taller=FALSE ;}}}
return TRUE ;}

typedef BSTree SElemType;//这个很重要,定义栈的元素类型为二叉树结点指针BSTree
//栈的顺序存储表示
//SElemType为栈元素,由用户在主函数中定义
#define STACK_INIT_SIZE 100 /* 存储空间初始分配量 */
#define STACKINCREMENT 10 /* 存储空间分配增量 */
typedef struct SqStack
{SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
SElemType *top; /* 栈顶指针 */
int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack; /* 顺序栈 */
//顺序栈(存储结构由SqStack.h定义)的基本操作
Status InitStack(SqStack *S)
{ /* 构造一个空栈S */
(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存储分配失败 */
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return OK;}

Status StackEmpty(SqStack S)
{ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
if(S.top==S.base)
return TRUE;
else
return FALSE;}

Status Push(SqStack *S,SElemType e)
{ /* 插入元素e为新的栈顶元素 */
if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */
{(*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存储分配失败 */
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;}
*((*S).top)++=e;
return OK;}

Status Pop(SqStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
if((*S).top==(*S).base)
return ERROR;
*e=*--(*S).top;
return OK;}
void PreOrderTraverse(BSTree T,Status(*Visit)(ElemType e))
//非递归先序遍历二叉树
{BSTree p,e ;
SqStack S ;
InitStack(&S);
p=T ;
while(p||!StackEmpty(S))
{//遍历左子树
while(p)
{ (*Visit)(p->data);
Push(&S,p);
p=p->lchild ;}
//通过下一次循环中的内嵌while实现右子树遍历
if(!StackEmpty(S))
{Pop(&S,&e);
p=e->rchild ;}}}

void InOrderTraverse(BSTree T,Status(*Visit)(ElemType e))
{/* 初始条件: 二叉树T存在,Visit是对结点操作的应用函数 */
/* 操作结果: 中序递归遍历T,对每个结点调用函数Visit一次且仅一次 */
if(T)
{InOrderTraverse(T->lchild,(*Visit));
/* 先中序遍历左子树 */
(*Visit)(T->data);
/* 再访问根结点 */
InOrderTraverse(T->rchild,(*Visit));
/* 最后中序遍历右子树 */}}

void PostOrderTraverse(BSTree T,Status(*Visit)(ElemType e))
{/* 初始条件: 二叉树T存在,Visit是对结点操作的应用函数 */
/* 操作结果: 后序递归遍历T,对每个结点调用函数Visit一次且仅一次 */
/* T不空 */
if(T)
{PostOrderTraverse(T->lchild,(*Visit));
/* 先后序遍历左子树 */
PostOrderTraverse(T->rchild,(*Visit));
/* 再后序遍历右子树 */
(*Visit)(T->data);
/* 最后访问根结点 */}}

/*输出元素*/
Status PrintElement(ElemType e)
{printf(FORMAT,e);
return OK ;}

#include"RandomHundred.c"
//功能模块1-void RandomHundred(int ran[100]);产生100个不大于100且各不相同的整数,存放在ran[100]中
#include"BSTree.h"
//平衡二叉排序树的类型定义
#include"InsertAVL.c"
//功能模块2-Status InsertAVL(BSTree *T,ElemType e,Status *taller);
//平衡二叉排序树T插入元素e,taller为长高标志供递归调用时检查
typedef BSTree SElemType;//这个很重要,定义栈的元素类型为二叉树结点指针BSTree
#include"SqStack.h"
//顺序栈的存储结构
#include"SqStack.c"
//栈的操作:供非递归先序遍历用
#include"Traverse.c"
//功能模块3-void PreOrderTraverse(BSTree T,Status (*Visit)(ElemType e));非递归先序遍历二叉树
//void InOrderTraverse(BSTree T,Status(*Visit)(ElemType e));中序遍历二叉树
//void PostOrderTraverse(BSTree T,Status(*Visit)(ElemType e));后序遍历二叉树
//Status PrintElement(ElemType e);输出元素函数,供遍历调用
main()
{//主函数
BSTree T=NULL ;
//注意T必须先置空,非常重要
int i,ran[100];
//i为计数器,ran数组用于存放从RandomHundred函数随机得来的1-100
Status taller ;
//长高与否标志,可以不初始化
printf("数据结构课程设计题目:\n");
printf("1--利用随机函数产生100个(不大于100且各不相同的)随机整数\n");
printf("2--用这些整数来生成一棵二叉树\n");
printf("3--分别对二叉树进行先序遍历,中序遍历和后序遍历输出树中结点元素序列\n");
printf("注意:先序遍历输出要求采用非递归来实现\n\n");
printf("产生100个(不大于100且各不相同的)随机整数:\n");
RandomHundred(ran);
for(i=0;i<100;++i)printf(FORMAT,ran[i]);
printf("\n\n");
for(i=0;i<100;++i)InsertAVL(&T,ran[i],&taller);
printf("已经按以上顺序把这些整数一个一个插入平衡二叉排序树!\n\n");
printf("先序遍历二叉树(采用非递归算法):\n");
PreOrderTraverse(T,PrintElement);
printf("\n");
printf("中序遍历二叉树:\n");
InOrderTraverse(T,PrintElement);
printf("\n");
printf("后序遍历二叉树:\n");
PostOrderTraverse(T,PrintElement);
printf("\n\n");
printf("课程设计题目演示完毕!\n06级统计一班 高翕山 200630980108\n");
getch();
}
另外,团IDC网上有许多产品团购,便宜有口碑

热心网友 时间:2022-04-26 20:19

#include<stdio.h>
#include<stdlib.h>
typedef struct bitree{
int data;
struct bitree *lchild,*rchild;
}BitNode,*BiTree;
int x;
BiTree Init()
{
BiTree bt;
bt=NULL;
return bt;
}
void Vist(BiTree p)
{
printf("%d ",p->data);
}
BiTree Create()
{
BiTree p;
scanf("%d",&x);
if(x==0)p=NULL;
else{
p=(BitNode *)malloc(sizeof(BitNode));
p->data=x;
p->lchild=Create();
p->rchild=Create();
}
return p;
}
void Preorder(BiTree bt)
{
if(bt==NULL)return;
Vist(bt);
Preorder(bt->lchild);
Preorder(bt->rchild);
}
void Inorder(BiTree bt)
{
if(bt==NULL)return;
Inorder(bt->lchild);
Vist(bt);
Inorder(bt->rchild);
}
void Postorder(BiTree bt)
{
if(bt==NULL)return;
Postorder(bt->lchild);
Postorder(bt->rchild);
Vist(bt);
}
int main()
{
BiTree t;
int choice;
t=Init();
printf("请以先序遍历的方法输入数据:\n");
t=Create();
while(1){
printf("请选择:1.先序遍历 2.中序遍历 3.后序遍历(输入0结束)");
scanf("%d",&choice);
switch(choice){
case 1:Preorder(t);break;
case 2:Inorder(t);break;
case 3:Postorder(t);break;
case 0:exit(0);
}
printf("\n");
}
return 0;
}

输入例子:1 2 0 0 3 0 0 数据用空格隔开,0表示数据为空;
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
很累很烦朋友圈说说 感觉自己很没有精神的朋友圈 很累很疲倦的文案大全 ...不喜欢外人参加1111特别是男生1111这是为什么111谁帮我分析下这种... ...全国出生人口956万 2022年出生人口性别比111.1 扬州市邗江区最差的三个镇是哪三个 听同事说有家专门做去日本留学的中介,不知道在哪儿到底怎么样啊?_百 ... 初中毕业去日本读高中好吗 去日本留学必须需要走中介吗 翘首以待的"翘"应该读二声还是四声? 翘,这个字读音,什么时候是二声,什么时 先序建立二叉树是怎么建立的 建立二叉树,层序、先序遍历 利用先序遍历算法建立如图所示二叉树,并对二叉树进行先序遍历. 建立二叉树,并实现先序遍历 C语言先序建立二叉树(如何结束输入) 由先序遍历与中序遍历构建二叉树 电子秤13元一两怎么显示 电子秤两斤显示多少? java web类中怎么嵌套html代码 如果报停手机号怎么找回 我手机丢了卡报停了微信冻结了补回来的卡在第二台手机上还有旧的微信吗? 手机掉了,电话卡已经报停,微信别人已经在用,怎么样才能把手机找回 摩拜的收费标准是什么? 哈利波特与密室中一句话的翻译 阳历81年4月9日2点多生人,我的八字是什么啊?我是石榴木命,好像五行缺木,我带木手串可以吗? 哈利波特与密室五句话概括 关于哈利 姓黄的有哪些名字 要带木字旁的 CF带鬼字的战队名有木有?要唯美的 哈利波特与密室电影台词 手机挣钱的软件哪个最靠谱 是的,是已知前序遍历和中序遍历,建立二叉树具体应该怎么办呢 输入二叉树的前序遍历和中序遍历序列,生成此二叉树 二叉树的创建和前序遍历,这程序怎么崩了? 请问下建立二叉树是先序遍历的建立吗 二叉树的建立及先、中、后序遍历 、建立一颗二叉树,并分别按先序、中序和后序遍历这棵二叉树,要求以二叉链表作为存储结构 我用花呗买东西后来把花呗的钱还了,然后又退款,那么这个款会退到哪里呢? 韩国电影奇怪的她链接 好像有一部电影,影片开始好像有个女的是瞎子,然后影片结束的时候出现的也是她,是叫什么? Windows10电脑怎样才能录音 最近看了一部美国电影很喜欢里面的女主角,我已经被迷得有些无法自拔了,非常想见到她,请问我该怎么办? 找《我的女孩》的免费电影网址 追加10分! 2020年驾驶证D证怎么办理? d证行驶证如何办理 医院微信挂号后,诊疗费可否用社保卡支付 如何在 Java 代码隐藏 HTML 模块中调用 HTML 脚本代码 社保卡可以用微信预约挂号吗? 英语小报 关于读书的 可以给些名人的读书故事 要英文的!!! 关于名人的小故事(英语)
  • 焦点

最新推荐

猜你喜欢

热门推荐