//先序遍历 (根左右)
void PreOrder(BiTree T) {
if (T != NULL) {
visit(T); //访问根结点
PreOrder(T->lchild); //访问左孩子
PreOrder(T->rchild); //访问右孩子
}
}
//中序遍历 (左根右)
void InOrder(BiTree T) {
if (T != NULL) {
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
//后序遍历 (左右根)
void PostOrder(BiTree T) {
if (T != NULL) {
PostOrder(T->lchild); //访问左孩子
PostOrder(T->rchild); //访问右孩子
visit(T); //访问根结点
}
}
//二叉树的层次遍历算法,构造队列
//二叉树的结点链式存储
//队列的链式存储
typedef struct BiTNode{
int data; //数据域
struct BiTNode *lchild,*rchild; //左孩子、右孩子
}BiTNode,* BiTree;
//链式队列结点
typedef struct LinkNode{
BiTNode *data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;//队列的头指针和尾指针
}LinkQueue;
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,BiTree x){//入队 (带头结点)
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
bool DeQueue(LinkQueue &Q,BiTree &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;
}
void visit(BiTree p){
printf("%d ",p->data);
}
void LevelOrder(BiTree T){
LinkQueue Q;
InitQueue(Q); //初始化辅助队列
BiTree p;
EnQueue(Q,T);
while(!IsEmpty(Q)){
DeQueue(Q,p);
visit(p);
if(p->lchild!=NULL)
EnQueue(Q,p->lchild);
if(p->rchild!=NULL)
EnQueue(Q,p->rchild);
}
}
【数据结构】二叉树的一般遍历
最新推荐文章于 2023-09-20 20:05:30 发布