数据结构之链式二叉树

//二叉树链式存储 


#include<stdio.h>
#include<math.h>

#define ElemType char
#define MaxSize 20

typedef struct BiNode
{
ElemType data;
struct BiNode *lchild,*rchild;
} BiTNode,*BiTree;

//层次遍历需要一个队列来储存树的指针
//可以用数组来解决数组大小可以利用树的层与该层节点数量的关系算出,因为是实验,所以就随便设个大点的了
typedef struct Queue
{
BiTree data[100];

int front_queue,rear_queue;
} SqQueue;


//中序输入
BiTree create_Tree()
{
ElemType target;
scanf("%c",&target);
if(target=='#')return NULL;

else
{
BiTree Node=(BiTree)malloc(sizeof(BiTNode));//这是换一种写法,王道考研书的写法BiTree==*BiNode
Node->data=target;
Node->lchild=create_Tree();
Node->rchild=create_Tree();
return Node;
}
}

//中序打印
void N_show_Tree(BiTree Tree)
{

if(Tree)
{
N_show_Tree(Tree->lchild);
printf("%c ",Tree->data);
N_show_Tree(Tree->rchild);
}

}

//前序打印
void L_show_Tree(BiTree Tree)
{

if(Tree)
{
printf("%c ",Tree->data);
L_show_Tree(Tree->lchild);

L_show_Tree(Tree->rchild);
}

}

//后序打印
void R_show_Tree(BiTree Tree)
{

if(Tree)
{
R_show_Tree(Tree->lchild);
R_show_Tree(Tree->rchild);
printf("%c ",Tree->data);
}

}

 


//初始化,将队列的前尾都赋值为零,代表是空队列
void init_queue(SqQueue *Q)
{
Q->front_queue=0;
Q->rear_queue=0;
}

int QueueEmpty(SqQueue Q)
{
if(Q.front_queue==Q.rear_queue)
return 1;//空

return 0;//不空
}

int QueueFull(SqQueue Q)
{
if(Q.front_queue==0&&Q.rear_queue==MaxSize)
return 1;
return 0;
}
void EnQueue(SqQueue *Q,BiTree target)
{
if(QueueFull(*Q))//判断是否是满
{
printf("队列满了\n");
return;
}
Q->data[(Q->rear_queue)]=target;//因为是从零开始的,那么第一个位置也是可以放东西的,先把东西方在当前,再去++

Q->rear_queue++;
}

void DeQueue(SqQueue *Q)
{
if(QueueEmpty(*Q))
{
printf("队列空\n");
return;
}
//*target=Q->data[Q->front_queue];
Q->front_queue++;//因为我们初始化将两个标识都设置为0,所以我们在删除数据的时候呢就是将front游标往右边移动
}

BiTree GetHead(SqQueue *Q)
{
if(QueueEmpty(*Q))
{
printf("队列空\n");
return NULL;
}
return Q->data[Q->front_queue];
}


//层次遍历
void arr_show_Tree(BiTree Tree,SqQueue arr[])
{
if(Tree)
{
EnQueue(arr,Tree);
}
while(!QueueEmpty(*arr))
{
BiTree node=GetHead(arr);
printf("%c ",node->data);
DeQueue(arr);
if(node->lchild)EnQueue(arr,node->lchild);
if(node->rchild)EnQueue(arr,node->rchild);
}
}


int main()
{
//层次遍历用到的数组
SqQueue arr;
init_queue(&arr);

 

BiTree tree=NULL;

printf("中序输入,#结束\n");//abd##ef##g##c##
tree=create_Tree();
printf("前序打印\n");
L_show_Tree(tree);
printf("\n");
printf("中序打印\n");
N_show_Tree(tree);
printf("\n");
printf("后序打印\n");
R_show_Tree(tree);

printf("\n");
//层次遍历
printf("层次遍历\n");
arr_show_Tree(tree,&arr);

return 0;
}

 

 

posted @ 2022-07-20 20:04  天天掉头发  阅读(47)  评论(0)    收藏  举报
返回顶端