先序遍历
void unpre_order(btree_pnode t) //采用非递归方法先序遍历
{
linklist top;//top为指向栈顶结点的指针
top=stack_create();//初始化链式栈
while(t!=NULL || !(stack_empty(top)))
{
if(t!=NULL)
{
printf("%c",t->data);
if(t->rchild !=NULL)
stack_push(top,t->rchild); //入栈
t=t->lchild;
}
else
t=stack_pop(top); //出栈
}
stack_free(top); //释放栈
}
void unpre_order(btree_pnode t) //采用非递归方法先序遍历
{
linklist top;//top为指向栈顶结点的指针
top=stack_create();//初始化链式栈
/*
该函数包含的头文件 和 实现方法如下:
#include "linkstack.h" //链式栈的头文件,关于链式栈的相关函数实现方法请查看博主相关链式栈的文章,这里不做细讲
linklist stack_create()
{
linklist s;
if((s=(linklist)malloc(sizeof(listnode)))==NULL){
puts("malloc failed");
return NULL;
}
s->next=NULL;
return s;
}
*/
while(t!=NULL || !(stack_empty(top))){
/*
该函数包含的头文件 和 实现方法如下:
#include "linkstack.h" //链式栈的头文件,关于链式栈的相关函数实现方法请查看博主相关链式栈的文章,这里不做细讲
int stack_empty(linklist s) //判断栈是否为空(1表示空,0表示非空)
{
return (s->next==NULL ? 1:0);
}
*/
if(t!=NULL){
printf("%c",t->data);
if(t->rchild !=NULL)
stack_push(top,t->rchild); //入栈
/*
该函数包含的头文件 和 实现方法如下:
#include "linkstack.h" //链式栈的头文件,关于链式栈的相关函数实现方法请查看博主相关链式栈的文章,这里不做细讲
int stack_push(linklist s,datatype_ls value) //入栈
{
linklist p;
if((p=(linklist)malloc(sizeof(listnode)))==NULL)
{
puts("malloc failed");
return -1;
}
p->data = value;
p->next=s->next;
s->next = p;
return 0;
}
*/
t=t->lchild;
}else
t=stack_pop(top); //出栈
/*
该函数包含的头文件 和 实现方法如下:
#include "linkstack.h" //链式栈的头文件,关于链式栈的相关函数实现方法请查看博主相关链式栈的文章,这里不做细讲
datatype_ls stack_pop(linklist s) //出栈
{
linklist p;
datatype_ls ret;
p=s->next;
s->next=p->next;
ret=p->data;
free(p);
p=NULL;
return ret;
}
*/
}
stack_free(top); //释放栈
/*
该函数包含的头文件 和 实现方法如下:
#include "linkstack.h" //链式栈的头文件,关于链式栈的相关函数实现方法请查看博主相关链式栈的文章,这里不做细讲
void stack_free(linklist s) //释放栈
{
linklist p;
printf("free:");
p=s;
while(p)
{
s=s->next;
printf("%d ",p->data);
free(p);
p=s;
}
putchar(10); //10 表示 回车符('\n')
}
*/
}
---------------------
作者:许新天
来源:优快云
原文:https://blog.youkuaiyun.com/weixin_39148042/article/details/80960356
版权声明:本文为博主原创文章,转载请附上博文链接!
层序遍历
void level_order(btree_pnode t) //层次遍历
{
link_pqueue q;
init_linkqueue(&q);//初始化链式队列
while(t!=NULL)
{
//访问t指向的结点数据
printf("%c",t->data);
//当t的左指针不为空,则入队
if(t->lchild!=NULL)
in_linkqueue(t->lchild,q);
//当t的右指针不为空,则入队
if(t->rchild!=NULL)
in_linkqueue(t->rchild,q);
//队列不为空,则出队
if(!is_empty_linkqueue(q))
out_linkqueue(q,&t);
else
break;
}
free_linkqueue(q); //释放队列
}
void level_order(btree_pnode t) //层次遍历
{
link_pqueue q;
init_linkqueue(&q);//初始化链式队列
/*
该函数包含的头文件 和 实现方法如下:
#include "linkqueue.h" //链式队列的头文件,关于链式队列的相关函数实现方法请查看博主相关链式队列的文章,这里不做细讲
void init_linkqueue(link_pqueue *Q) //创建队列
{
//申请front和rear的空间
*Q=(link_pqueue)malloc(sizeof(link_queue));
if((*Q)==NULL)
{
perror("malloc");
exit(-1);
}
//申请头结点空间
(*Q)->front=(linkqueue_pnode)malloc(sizeof(linkqueue_node));
if((*Q)->front==NULL)
{
perror("malloc");
exit(-1) ;
}
(*Q)->front->next=NULL;
(*Q)->rear=(*Q)->front;
return;
}
*/
while(t!=NULL)
{
//访问t指向的结点数据
printf("%c",t->data);
//当t的左指针不为空,则入队
if(t->lchild!=NULL)
in_linkqueue(t->lchild,q);
/*
该函数包含的头文件 和 实现方法如下:
#include "linkqueue.h" //链式队列的头文件,关于链式队列的相关函数实现方法请查看博主相关链式队列的文章,这里不做细讲
bool in_linkqueue(datatype data,link_pqueue q) //入队
{
linkqueue_pnode new;
//申请数据结点空间
new=(linkqueue_pnode)malloc(sizeof(linkqueue_node));
if(new==NULL)
{
puts("入队失败!");
return false;
}
//将数据存储在申请的空间
new->data=data;
//将new指向的结点插入到链式队列中
new->next=q->rear->next; //这里等价于new->next = NULL;
q->rear->next=new;
//让rear指针指向新的队尾结点
q->rear=q->rear->next; //等价于q->rear = new;
return true;
}
*/
//当t的右指针不为空,则入队
if(t->rchild!=NULL)
in_linkqueue(t->rchild,q);
//队列不为空,则出队
if(!is_empty_linkqueue(q))
out_linkqueue(q,&t);
/*
该函数包含的头文件 和 实现方法如下:
#include "linkqueue.h" //链式队列的头文件,关于链式队列的相关函数实现方法请查看博主相关链式队列的文章,这里不做细讲
bool out_linkqueue(link_pqueue q,datatype *D) //出队
{
linkqueue_pnode t;
//判断队列是否空
if(is_empty_linkqueue(q)){
printf("队列已空!\n");
return false;
}
//出队
t=q->front;
q->front =q->front->next;
*D=q->front->data;
free(t);
return true;
}
*/
else
break;
}
free_linkqueue(q); //释放队列
/*
该函数包含的头文件 和 实现方法如下:
#include "linkqueue.h" //链式队列的头文件,关于链式队列的相关函数实现方法请查看博主相关链式队列的文章,这里不做细讲
void free_linkqueue(link_pqueue q) //释放队列
{
link_pqueue p;
p = q->front;
while(p)
{
q->front = q->front->next;
free(p);
p = q->front;
}
free(q);
}
*/
}
---------------------
作者:许新天
来源:优快云
原文:https://blog.youkuaiyun.com/weixin_39148042/article/details/80960356
版权声明:本文为博主原创文章,转载请附上博文链接!