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

#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 "


测试所用树


测试结果



  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值