#include <stdio.h>
#include <stdlib.h>
typedef char BiElemType;
typedef struct BiTNode{
BiElemType data;
BiTNode *lchild;
BiTNode *rchild;
}BiTNode,*BiTree;
//辅助队列,用于辅助建树
typedef struct tag{
BiTNode *p;//树某一个结点的地址值
tag *pnext;
}tag_t,*ptag_t;
#define MaxSize 6
#define ElementType BiTree
typedef struct LinkNode{
ElementType data;
LinkNode *next;
}LinkNode,*LinkList;
typedef struct {
LinkNode *front,*rear;//链表头,链表尾
}LinkQueue;
void InitQ(LinkQueue &Q){
Q.front=Q.rear=(LinkNode*) malloc(sizeof(LinkNode));
Q.front->next=NULL;
}
void EnQueue(LinkQueue &Q,ElementType ele){
LinkNode *NewNode=(LinkNode *)malloc(sizeof(LinkNode));
NewNode->data=ele;
Q.rear->next=NewNode;
Q.rear=Q.rear->next;
Q.rear->next=NULL;
}
void DeQueue(LinkQueue &Q,ElementType &DelEle){
LinkNode *DelNode;
//判断队列是否为空
if(Q.front!=Q.rear){
DelNode=Q.front->next;
DelEle=DelNode->data;
Q.front->next=DelNode->next;
//链表只剩一个节点的时候使Q.rear=Q.front
if(Q.rear==DelNode)
Q.rear=Q.front;
free(DelNode);
}
else{
printf("the Queue is empty");
}
}
bool isEmpty(LinkQueue Q){
if(Q.front==Q.rear){
return true;
}
else
return false;
}
//建树abcdefghij
void BuildTag(BiTree root,ptag_t &Q){
Q=(ptag_t) malloc(sizeof(tag));
Q->p=root;
Q->pnext=NULL;
ptag_t newNode;
ptag_t rear=Q;
int ele=65;//a的码值
for (int cnt = 0; cnt < 10; ++cnt) {
newNode=(ptag_t) malloc(sizeof (tag));
//申请空间,并初始化为0
newNode->p=(BiTNode*) calloc(1,sizeof (BiTNode));
newNode->p->data=ele;
ele++;
rear->pnext=newNode;
newNode->pnext=NULL;
rear=rear->pnext;
}
}
void BuildTree(BiTree &root,ptag_t &Q){
//cur为当前要创建左右子树的节点
tag* cur=Q->pnext;
//ptr指向将要插入到父节点的子节点
tag* ptr=Q->pnext->pnext;
root=cur->p;
BiTree curBiNode=root;
while(ptr){
//如果当前父亲节点的左边孩子为空,那么向左边插入
if(NULL==cur->p->lchild){
curBiNode->lchild=ptr->p;
ptr=ptr->pnext;
}//左边孩子不为空那么向右边孩子插入
else if(NULL==cur->p->rchild){
curBiNode->rchild=ptr->p;
ptr=ptr->pnext;
}
//都已满那么进行下一个父亲节点左右孩子的创建
else{
cur=cur->pnext;
curBiNode=cur->p;
}
}
}
void PreOrder(BiTree biTree){
if(biTree){
printf("%c",biTree->data);
PreOrder(biTree->lchild);
PreOrder(biTree->rchild);
}
}
void InOrder(BiTree biTree){
if(biTree){
InOrder(biTree->lchild);
printf("%c",biTree->data);
InOrder(biTree->rchild);
}
}
void PostOrder(BiTree biTree){
if(biTree){
PostOrder(biTree->lchild);
PostOrder(biTree->rchild);
printf("%c",biTree->data);
}
}
void BFS(BiTree biTree){
LinkQueue Q;
InitQ(Q);
BiTNode *p=biTree;
//树根入队
EnQueue(Q,biTree);
ElementType delEle;
while (!isEmpty(Q)){
p=Q.front->next->data;
DeQueue(Q,delEle);
printf("%c",delEle->data);
if(p->lchild){
EnQueue(Q,p->lchild);
}
if(p->rchild){
EnQueue(Q,p->rchild);
}
}
}
int main() {
BiTree root;
ptag_t Q;
BuildTag(root,Q);
BuildTree(root,Q);
InOrder(root);
printf("\nbfs:\n");
BFS(root);
return 0;
}
二叉树的前序,中序,后序,BFS
最新推荐文章于 2024-07-25 17:43:13 发布