在前文中对二叉树的层序建立使用了辅助队列,但该队列与一般的队列数据结构有所不同,所以我就采用queue.h的操作方法对层序建立进行了修改
本文分为三个部分
//function2.h对树和队列的结构进行了描述
//queue2.cpp中包含了队列的操作函数
//main.cpp为层序遍历的代码
二叉树的层序建立
function2.h
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct LinkNode{
ElemType data;//此处的data类型为char,与前文不同
struct LinkNode *next;
}LinkNode;
typedef struct LinkQueue{
LinkNode *front,*rear;
}LinkQueue;
void InitQueue(LinkQueue &Q);
bool IsEmpty(LinkQueue Q);
void EnQueue(LinkQueue &Q,ElemType x);
bool DeQueue(LinkQueue &Q,ElemType &x);
queue2.cpp
#include "function2.h"
void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
Q.front->next = NULL;
}
bool IsEmpty(LinkQueue Q)
{
if(Q.front==Q.rear)
{
return true;
}else
{
return false;
}
}
void EnQueue(LinkQueue &Q,ElemType x)
{
LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
Q.rear->next = s;
Q.rear = s;
}
bool DeQueue(LinkQueue &Q,ElemType &x)
{
if(Q.front==Q.rear)
{
return false;
}
LinkNode *p = Q.front->next;
x = p->data;
Q.front->next = p->next;
if(Q.rear ==p)
{
Q.rear = Q.front;
}
free(p);
return true;
}
main.cpp
#include "function2.h"
int main()
{
BiTree T=NULL;//树的根节点
LinkQueue Q;
InitQueue(Q);
printf("请按层序结构输入树的内容:");
char c;
while(scanf("%c",&c))
{
if(c=='\n')
{
break;
}
EnQueue(Q,c);//将字符都入队
}
BiTNode *pcur;//树的指针
while(!IsEmpty(Q))
{
BiTNode *pnew;// 新建一个树的结点
pnew = (BiTNode *)malloc(sizeof(BiTNode));
pnew->lchild = NULL;
pnew->rchild = NULL;
DeQueue(Q,pnew->data);//将字符出队
if(T==NULL)
{
T = pnew;
pcur = pnew;
}else if(pcur->lchild==NULL)
{
pcur->lchild = pnew;
}else if(pcur->rchild==NULL)
{
pcur->rchild = pnew;
pcur = pcur->lchild;
}
}
return 0;
}
输入abcde为层序建立的内容

从调试结果可以看出,层序建立二叉树正确

进一步思考,如果直接用前文的层序遍历的代码,则会报错,因为前文对queue的结构定义与本文不同。在实际操作中,可以采用前文的数据结构的定义,然后对本文的代码略加修改,即可实现层序建树和遍历。
文章介绍了如何使用C++实现二叉树的层序建立,通过自定义链式队列数据结构,以及层序遍历的代码。在层序建立过程中,从输入的字符序列创建二叉树,并提供了初始化队列、入队、出队等操作。由于队列结构的不同,直接应用前文的层序遍历代码会导致错误,需要适当修改。
1061

被折叠的 条评论
为什么被折叠?



