二叉树排序 --C语言数据结构
2008-08-20 09:48
316 查看
#include <stdio.h>
#include <stdlib.h>
typedef struct btree
{
int data;
struct btree *left;
struct btree *right;
}BTR,*PBTR;
typedef struct BTRSt
{
PBTR ptree;
struct BTRSt *link;
}Stack,*PStack;
PBTR Bitree=NULL;
/*
函数功能:实现非递归建立二叉树
函数原型:void creat_btree(int *a,int size)
函数参数:int *a :保存二叉树节点的数组首地址
int size:节点数目
函数返回值:void
作者 : 李文塔 Wenta Li
日期: 2008年5月19日
优点:建立的二叉树按中序遍历后:是从小到大有序的可以是一种排序算法
*/
void creat_btree(int *a,int size)
{
int i;
PBTR pre,pre2;
for(i=0;i<size;i++)
{
if(Bitree==NULL)
{
Bitree=(PBTR)malloc(sizeof(BTR));
if(Bitree==NULL)
{
printf("Malloc fail/n");
break;
}
else
{
Bitree->data=a[i];
Bitree->left=NULL;
Bitree->right=NULL;
continue;
}
}
else
{
pre = Bitree;
}
while(1)
{
if(a[i]>pre->data)
{
if(pre->right==NULL)
{
pre2=(PBTR)malloc(sizeof(BTR));
if(pre2==NULL)
{
printf("Malloc fail/n");
break;
}
else
{
pre2->data=a[i];
pre2->left=NULL;
pre2->right=NULL;
pre->right=pre2;
break;
}
}
else
{
pre=pre->right;
}
}
else
{
if(pre->left==NULL)
{
pre2=(PBTR)malloc(sizeof(BTR));
if(pre2==NULL)
{
printf("Malloc fail/n");
break;
}
else
{
pre2->data=a[i];
pre2->left=NULL;
pre2->right=NULL;
pre->left=pre2;
break;
}
}
else
{
pre=pre->left;
}
}
}
}
}
/*
函数功能:实现递归前序遍历二叉树
函数原型:void preorder(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:void
作者 : 李文塔 Wenta Li
日期: 2008年5月19日
*/
void preorder(PBTR p)
{
if(p!=NULL)
{
printf("%4d",p->data);
preorder(p->left);
preorder(p->right);
}
}
/*
函数功能:实现递归中序遍历二叉树
函数原型:void midorder(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:void
作者 : 李文塔 Wenta Li
日期: 2008年5月19日
*/
void midorder(PBTR p)
{
if(p!=NULL)
{
midorder(p->left);
printf("%4d",p->data);
midorder(p->right);
}
}
/*
函数功能:实现递归中序遍历二叉树
函数原型:void postorder(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:void
作者 : 李文塔 Wenta Li
日期: 2008年5月19日
*/
void postorder(PBTR p)
{
if(p!=NULL)
{
postorder(p->left);
postorder(p->right);
printf("%4d",p->data);
}
}
/*
函数功能:递归求二叉树的深度
函数原型:int btreedepth(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:int :二叉树的深度
作者 : 李文塔 Wenta Li
日期: 2008年5月21日12:14
*/
int btreedepth(PBTR head)
{int h,hl,hr;
PBTR p;
p=head;
if(p==NULL)
{
h=0;
}
else
{
hl=btreedepth(p->left);
hr=btreedepth(p->right);
if(hl>hr)
{
h=hl+1;
}
else
{
h=hr+1;
}
}
return h;
}
/*主函数 main()作测试用*/
#define N 12
int main()
{ int h;
int a
={1,45,89,13,24,56,39,78,79,69,20,44};
printf("非递归建立建立二叉树..../n");
creat_btree(a,N);
printf("前序遍历: ");
preorder(Bitree);
printf("/n非递归建立建立二叉树后中序遍历就是按照由小到大排序");
printf("/n中序遍历: ");
midorder(Bitree);
printf("/n后续遍历: ");
postorder(Bitree);
printf("/n二叉树的深度是:/n");
printf("%4d/n",btreedepth(Bitree));
getchar();
}
#include <stdlib.h>
typedef struct btree
{
int data;
struct btree *left;
struct btree *right;
}BTR,*PBTR;
typedef struct BTRSt
{
PBTR ptree;
struct BTRSt *link;
}Stack,*PStack;
PBTR Bitree=NULL;
/*
函数功能:实现非递归建立二叉树
函数原型:void creat_btree(int *a,int size)
函数参数:int *a :保存二叉树节点的数组首地址
int size:节点数目
函数返回值:void
作者 : 李文塔 Wenta Li
日期: 2008年5月19日
优点:建立的二叉树按中序遍历后:是从小到大有序的可以是一种排序算法
*/
void creat_btree(int *a,int size)
{
int i;
PBTR pre,pre2;
for(i=0;i<size;i++)
{
if(Bitree==NULL)
{
Bitree=(PBTR)malloc(sizeof(BTR));
if(Bitree==NULL)
{
printf("Malloc fail/n");
break;
}
else
{
Bitree->data=a[i];
Bitree->left=NULL;
Bitree->right=NULL;
continue;
}
}
else
{
pre = Bitree;
}
while(1)
{
if(a[i]>pre->data)
{
if(pre->right==NULL)
{
pre2=(PBTR)malloc(sizeof(BTR));
if(pre2==NULL)
{
printf("Malloc fail/n");
break;
}
else
{
pre2->data=a[i];
pre2->left=NULL;
pre2->right=NULL;
pre->right=pre2;
break;
}
}
else
{
pre=pre->right;
}
}
else
{
if(pre->left==NULL)
{
pre2=(PBTR)malloc(sizeof(BTR));
if(pre2==NULL)
{
printf("Malloc fail/n");
break;
}
else
{
pre2->data=a[i];
pre2->left=NULL;
pre2->right=NULL;
pre->left=pre2;
break;
}
}
else
{
pre=pre->left;
}
}
}
}
}
/*
函数功能:实现递归前序遍历二叉树
函数原型:void preorder(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:void
作者 : 李文塔 Wenta Li
日期: 2008年5月19日
*/
void preorder(PBTR p)
{
if(p!=NULL)
{
printf("%4d",p->data);
preorder(p->left);
preorder(p->right);
}
}
/*
函数功能:实现递归中序遍历二叉树
函数原型:void midorder(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:void
作者 : 李文塔 Wenta Li
日期: 2008年5月19日
*/
void midorder(PBTR p)
{
if(p!=NULL)
{
midorder(p->left);
printf("%4d",p->data);
midorder(p->right);
}
}
/*
函数功能:实现递归中序遍历二叉树
函数原型:void postorder(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:void
作者 : 李文塔 Wenta Li
日期: 2008年5月19日
*/
void postorder(PBTR p)
{
if(p!=NULL)
{
postorder(p->left);
postorder(p->right);
printf("%4d",p->data);
}
}
/*
函数功能:递归求二叉树的深度
函数原型:int btreedepth(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:int :二叉树的深度
作者 : 李文塔 Wenta Li
日期: 2008年5月21日12:14
*/
int btreedepth(PBTR head)
{int h,hl,hr;
PBTR p;
p=head;
if(p==NULL)
{
h=0;
}
else
{
hl=btreedepth(p->left);
hr=btreedepth(p->right);
if(hl>hr)
{
h=hl+1;
}
else
{
h=hr+1;
}
}
return h;
}
/*主函数 main()作测试用*/
#define N 12
int main()
{ int h;
int a
={1,45,89,13,24,56,39,78,79,69,20,44};
printf("非递归建立建立二叉树..../n");
creat_btree(a,N);
printf("前序遍历: ");
preorder(Bitree);
printf("/n非递归建立建立二叉树后中序遍历就是按照由小到大排序");
printf("/n中序遍历: ");
midorder(Bitree);
printf("/n后续遍历: ");
postorder(Bitree);
printf("/n二叉树的深度是:/n");
printf("%4d/n",btreedepth(Bitree));
getchar();
}
相关文章推荐
- C语言数据结构之二叉树的操作
- 数据结构C语言实现系列——二叉树[转]
- (C语言)二叉树实现(数据结构十三)
- [数据结构]C语言二叉树的实现
- 数据结构_求二叉树的宽度_C语言源代码
- (C语言)二叉树层次遍历(数据结构十六)
- 数据结构 c语言设计队列 实现桶式排序和基数排序 测试性能
- 数据结构——二叉树的遍历问题(C语言)
- 数据结构 c 排序大全(快速,分治,外部,bit,桶,堆,二叉树,希尔等)
- C语言数据结构二叉树简单应用
- C语言数据结构——数据结构有序二叉树的函数实现
- 数据结构(JAVA)---二叉树的简单实现及排序
- 选择排序 --C语言数据结构
- 数据结构-数组排序-二路归并-循环实现-C语言
- EKAlgorithms-常用数据结构Objective-C语言实现一数组排序
- C语言创建二叉树数据结构, 以及各种遍历
- 数据结构 C语言 链式二叉树
- (C语言)二叉树实现(数据结构十三)
- C语言实现数据结构之二叉树
- 数据结构与算法——二叉树高度(C语言)