二叉树递归和非递归遍历的C语言的实现
#递归实现
这个在逻辑和实现上都很简单,但是执行速度并不如非递归快,原因是递归必定反复进行函数调用,函数调用过程是比较慢的。
void CreateBitree(BiTree &t){ //先序建立二叉树
int in;
scanf("%d",&in);
if(in==0) t=NULL;
else{
t=(BiTree)malloc(sizeof(BiTnode));
t->data=in;
CreateBitree(t->lchild);
CreateBitree(t->rchild);
}
}
void inorder(BiTree t,int num){ //中序递归遍历
if(t){
inorder(t->lchild,num);
if(t->data==num)
flag=1;
inorder(t->rchild,num);
}
}
#非递归实现
非递归实现就比较麻烦一点,因为我们需要自己实现栈的那个过程,需要自己用C语言实现一个栈以栈操作。
栈结构
typedef struct{ //顺序栈的结构
BiTree *base;
BiTree *top;
int size;
}sqstack;
栈操作
int initstack(sqstack &s){ //栈初始化
s.base=(BiTree*)malloc(sizeof(BiTnode)*20);
s.top=s.base;
s.size=Maxsize;
return 1;
}
int push(sqstack &s,BiTree &t){ //压栈
if(s.top-s.base==s.size) return 0;
*s.top++ =t;
return 1;
}
int pop(sqstack &s,BiTree &e){//弹栈
if(s.base==s.top) return 0;
e=*--s.top;
return 1;
}
int stackempty(sqstack s){判断栈空
if(s.base==s.top)
return 1;
else return 0;
}
非递归遍历二叉树操作
void inordershow(BiTree t){
initstack(s);BiTree p=t;
BiTree q = (BiTree)malloc(sizeof(BiTnode));
while(p||!stackempty(s)){
if(p){
push(s,p);
p=p->lchild;
}
else{
pop(s,q);
printf("%d ",q->data);
p=q->rchild; //遍历右子树
}
}
// free(l);
}
##完整代码
/*......二叉树的基本操作.......*/
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 20
typedef struct BiTnode{ //二叉树的定义(链式)
int data;
struct BiTnode *lchild,*rchild;
}BiTnode,*BiTree;
typedef struct{ //顺序栈的结构
BiTree *base;
BiTree *top;
int size;
}sqstack;
sqstack s;
int initstack(sqstack &s){
s.base=(BiTree*)malloc(sizeof(BiTnode)*20);
s.top=s.base;
s.size=Maxsize;
return 1;
}
int push(sqstack &s,BiTree &t){
if(s.top-s.base==s.size) return 0;
*s.top++ =t;
return 1;
}
int pop(sqstack &s,BiTree &e){
if(s.base==s.top) return 0;
e=*--s.top;
return 1;
}
int stackempty(sqstack s){
if(s.base==s.top)
return 1;
else return 0;
}
int flag=0;
void CreateBitree(BiTree &t){ //先序建立二叉树
int in;
scanf("%d",&in);
if(in==0) t=NULL;
else{
t=(BiTree)malloc(sizeof(BiTnode));
t->data=in;
CreateBitree(t->lchild);
CreateBitree(t->rchild);
}
}
void inorder(BiTree t,int num){
if(t){
inorder(t->lchild,num);
if(t->data==num)
flag=1;
inorder(t->rchild,num);
}
}
void inordershow(BiTree t){
initstack(s);BiTree p=t;
BiTree q = (BiTree)malloc(sizeof(BiTnode));
while(p||!stackempty(s)){
if(p){
push(s,p);
p=p->lchild;
}
else{
pop(s,q);
printf("%d ",q->data);
p=q->rchild; //遍历右子树
}
}
// free(l);
}
int main(){
BiTree t;
CreateBitree(t);
inordershow(t);
inorder(t,3);
if(flag){
printf("you");
}
else printf("mei");
}