您的位置:首页 > 其它

动态二叉树的先序、中序、后序和层序遍历及转换为静态二叉树

2017-12-25 18:29 393 查看
#include<stdio.h>
#include<stdlib.h>

static int length=0;//二叉树结点个数

typedef struct Array//静态二叉链表节点
{
char data;
int lchild; //存左孩子的下标
int rchild; //存右孩子的下标
}Array;
Array Tree[20];//空的静态二叉树

typedef struct BiTNode //动态二叉链表节点
{
char data;
struct BiTNode *lchild,*rchild;//指向左右孩子的指针
}BiTNode,*BiTree;

BiTree CreateBiTree()//按先序构造动态二叉树,空格表示空树
{
char ch;
BiTree T;
scanf("%c",&ch);
if(ch==' ') T=NULL; //空格表示空树
else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=ch; //为根数据域赋值
T->lchild=CreateBiTree();//为左孩子数据域赋值
T->rchild=CreateBiTree();//为右孩子数据域赋值
}
return T;
}
//先根遍历,递归实现
void PreTraversingBiTree(BiTree T)
{
if(T)
{
printf("%c",T->data);
PreTraversingBiTree(T->lchild);
PreTraversingBiTree(T->rchild);
}
}
//中根遍历,递归实现
void MidTraversingBiTree(BiTree T)
{
if(T)
{
MidTraversingBiTree(T->lchild);
printf("%c",T->data);
MidTraversingBiTree(T->rchild);
}
}
//后根遍历,递归实现
void PostTraversingBiTree(BiTree T)
{
if(T)
{
PostTraversingBiTree(T->lchild);
PostTraversingBiTree(T->rchild);
printf("%c",T->data);
}
}
//求最大层数
int Maxdepth(BiTree T)
{
int left=0,right=0;
if(T)
{
left=Maxdepth(T->lchild); //向左的最大层数
right=Maxdepth(T->rchild); //向右的最大层数
}
return 1+(left>=right?left:right);
}
//层序遍历
void LevelTraversing(BiTree T,int level)//每层从左向右遍历
{
if(T)
{
if(level==1)
{
printf("%c",T->data);
Tree[++length].data=T->data;//层序遍历的同时给静态表赋值
}
else
{
LevelTraversing(T->lchild,--level);
LevelTraversing(T->rchild,level);
}
}
}

void LevelTraversingBiTree(BiTree T)//每层调用遍历函数
{
int i=1;
if(T)
for(i;i<=Maxdepth(T);i++)
LevelTraversing(T,i);
}

void BitreeTransform(BiTree T)//动态二叉树转换为静态二叉树
{
int i,j;
if(T)
{
for(j=1;T->data!=Tree[j].data;j++);//确定T结点的数组下标
if(T->lchild!=NULL)
{
for(i=1;T->lchild->data!=Tree[i].data;i++);
Tree[j].lchild=i; //寻找并确定左孩子结点的数组下标
}
else Tree[j].lchild=0; //没找到说明没有左孩子
if(T->rchild!=NULL)
{
for(i=1;T->rchild->data!=Tree[i].data;i++);
Tree[j].rchild=i; //寻找并确定右孩子结点的数组下标
}
else Tree[j].rchild=0; //没找到说明没有右孩子
BitreeTransform(T->lchild);
BitreeTransform(T->rchild);
}
}
int main()
{
printf("Input with order first:\n");
BiTree T;
T=CreateBiTree();
printf("Preorder traversal:\t");
PreTraversingBiTree(T);printf("\n");

printf("Mid travelsal:\t\t");
MidTraversingBiTree(T);printf("\n");

printf("Post travelsal:\t\t");
PostTraversingBiTree(T);printf("\n");

printf("Level travelsal:\t");
LevelTraversingBiTree(T);printf("\n\n");

BitreeTransform(T);
printf("static\n");
printf("index\tlchild\tdata\trchild\n");
for(int j=1;j<=length;j++)
printf("%d\t%d\t%c\t%d\n",j,Tree[j].lchild,Tree[j].data,Tree[j].rchild);
system("pause");
return 0;
}
//"ACB ED FG "


测试所用树



测试结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 遍历
相关文章推荐