本代码是在看了王道c语言督学营的视频后写的。层序建树最主要的是利用了辅助队列,运用尾插法使树的节点先入队列。通过队列的头指针pcur读取并判断树结点的左右指针是否为空从而实现建树。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define len1 sizeof(BiTNode)
#define len2 sizeof(queue)
typedef char ElemType;//元素类型
typedef struct BiTNode {
ElemType data;
struct BiTNode* lchild, * rchild;//左右孩子指针
}BiTNode,*BiTree;
//辅助队列
typedef struct SqQueue {
BiTree p; //树的结点的指针
struct SqQueue* pnext;
}SqQueue,*queue;
bool crateTree(BiTree& T)
{
ElemType x;
BiTree tree = NULL;//树根
BiTree pnew=NULL;
queue phead = NULL, ptail = NULL,listnew=NULL,pcur=NULL;
while (scanf("%c", &x) != EOF)
{
if (x == '\n') {
break;//输入换行结束
}
pnew = (BiTree)calloc(1, len1);//新的树的节点
pnew->data = x;
listnew = (queue)calloc(1, len2);
listnew->p = pnew;//树的结点入列
if (tree == NULL)
{
tree = pnew;
phead = listnew;
ptail = listnew;
pcur = listnew;
continue;
}
else
{
ptail->pnext = listnew; //尾插法使listnew入列
ptail = listnew;
}
if (pcur->p->lchild == NULL)
{
pcur->p->lchild = pnew;
}
else if (pcur->p->rchild == NULL)
{
pcur->p->rchild = pnew;
pcur = pcur->pnext;
}
continue;//程序继续,直到读取换行时break掉整个循环。
return true;
}
}
int main()
{
BiTree T;
crateTree(T);
}
输入abcd换行即可建树成功: