二叉树的先序创建和二叉树的深度遍历(先序,中序,后序)和广度(层次遍历)

二叉树的相关处理  藏剑问题

#include <stdio.h>

#include <stdlib.h>
#define bj 0
typedef struct node{
int value;
struct node *l_child;
struct node *r_child;
}BinaryTree;


typedef struct node_1{
BinaryTree *value;
struct node_1 *next;
}queue;


typedef struct node_2{
int count;
queue *phead;
queue *ptail;
}Queue;


队列的初始化
void Queue_init(Queue **q){
*q=(Queue*)malloc(sizeof(Queue));
(*q)->phead=NULL;
(*q)->ptail=NULL;
(*q)->count=0;
}


队列的装入元素
void Queue_push(Queue *q,BinaryTree *b){
if(q==NULL)  return ;
queue *u=(queue*)malloc(sizeof(queue));
u->value=b;
if(q->phead==NULL){
q->phead=u;
}
else{
q->ptail->next=u;
}
q->ptail=u;
q->count++;
}


探索出队列的首元素
BinaryTree* Queue_pop(Queue *q){
if(q==NULL)   return NULL;
queue *u=q->phead;
queue *t=q->phead;
BinaryTree *b=u->value;
q->phead=q->phead->next;
free(t);
t=NULL;
q->count--;
return b;
}


判断队列是否为空
int Queue_Is_Empty(Queue *q){
if(q==NULL)  return -1;
return q->count==0?1:0;
}


创建二叉树
void create(BinaryTree **p){
int num;
scanf("%d",&num);
if(num==bj)  return ;
    *p=(BinaryTree*)malloc(sizeof(BinaryTree));
(*p)->value=num;
(*p)->l_child=NULL;
(*p)->r_child=NULL;
create(&(*p)->l_child);
create(&(*p)->r_child);
}


二叉树的先序遍历
void PreTraver(BinaryTree *p){
if(p==NULL)  return ;
printf("%d ",p->value);
PreTraver(p->l_child);
PreTraver(p->r_child);
}


二叉树的中序遍历
void PmTraver(BinaryTree *p){
if(p==NULL)   return ;
PmTraver(p->l_child);
printf("%d ",p->value);
PmTraver(p->r_child);
}

二叉树的后序遍历
void PhTraver(BinaryTree *p){
if(p==NULL)   return ;
PhTraver(p->l_child);
PhTraver(p->r_child);
printf("%d ",p->value);


}


二叉树的广度遍历(层序遍历)
void According_C_Traver(BinaryTree *b){
if(b==NULL)  return ;
Queue *q=NULL;
Queue_init(&q);
Queue_push(q,b);
BinaryTree *u=NULL;
while(!Queue_Is_Empty(q)){
u=Queue_pop(q);
printf("%d ",u->value);
if(u->l_child!=NULL){
Queue_push(q,u->l_child);
}
if(u->r_child!=NULL){
Queue_push(q,u->r_child);
}
}
}


二叉树的按照行打印输出  并换行

void According_C_print(BinaryTree *b){

if(b==NULL)   return ;
Queue *q=NULL;
Queue_init(&q);    
BinaryTree *bj_in=(BinaryTree *)malloc(sizeof(BinaryTree));
bj_in->value=65535;
bj_in->l_child=NULL;
bj_in->r_child=NULL;
BinaryTree *u=NULL;


Queue_push(q,b);
Queue_push(q,bj_in);
while(!Queue_Is_Empty(q)){
u=Queue_pop(q);
if(u->value==65535){
   Queue_push(q,bj_in);
printf("\n*************************************\n");
}
else{
printf("%d ",u->value);
if(u->l_child!=NULL){
Queue_push(q,u->l_child);
}
if(u->r_child!=NULL){
Queue_push(q,u->r_child);
}
}
}
}




int main(){
BinaryTree *p;
create(&p);
PreTraver(p);
printf("\n********************************\n");
PmTraver(p);
printf("\n********************************\n");
PhTraver(p);
printf("\n********************************\n");
According_C_Traver(p);
printf("\n********************************\n");
According_C_print(p);



return 0;


}

猜你喜欢

转载自blog.csdn.net/qq_42211587/article/details/80889247