您的位置:首页 > 编程语言 > C语言/C++

二叉树 先序,中序,后序遍历(递归与非递归)C语言

2018-12-02 21:46 225 查看

二叉树 先序,中序,后序遍历(递归与非递归)C语言

#include<stdio.h>
#include<stdlib.h>
#define error 0
#define ok 1
#define overflow -1
#define STACK_INIT_SIZE 100 // 存储空间初始分配量。
#define STACKINCREMENT 10 // 存储空间分配增量。
typedef int status;
typedef struct bitnode
{
char data;
bitnode *lchild;
bitnode *rchild;
}bitnode,*bitree;
typedef struct
{
bitree *base;//在栈构造之前和销毁之后,base的值为 NULL。
bitree *top;//栈顶指针。
int stacksize;// 当前已分配的存储空间,以元素为单位。
}sqstack;
status initstack(sqstack &s)//构造空栈s。
{
s.base=(bitree *)malloc(STACK_INIT_SIZE*sizeof(bitree));
if(s.base==NULL)exit(overflow);//存储分配失败。
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return ok;
}//initstack.
status push(sqstack &s,bitree e)//插入元素e为新的栈顶元素。
{
if(s.top-s.base>=s.stacksize)//判满。
{
s.base=(bitree *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(bitree));
if(s.base==NULL)exit(overflow);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
//*s.top=e;s.top++;
return ok;
}//push
status stackempty(sqstack &s)//判空。
{
if(s.base==s.top)return ok;
return error;
}//stackempty。
status pop(sqstack &s,bitree &x)//返回栈顶元素,并删除。
{
if(s.top==s.base)return error;
x=*--s.top;
return ok;
}//pop.
status gettop(sqstack s,bitree &e)//取栈顶元素,不删除。
{
if(s.base==s.top)return error;
e=*(--s.top);
return ok;
}//gettop.
int stacklength(sqstack &s)//返回长度。
{
return s.top-s.base;
}//length.
status createbitree(bitree &t)//先序次序输入二叉树中节点值(char),空格字符表示空树。
{
char ch;
scanf("%c",&ch);
if(ch==' ')t=NULL;
else
{	t=(bitnode *)malloc(sizeof(bitnode));
if(t==NULL)exit(overflow);
t->data=ch;
createbitree(t->lchild);
createbitree(t->rchild);
}
return ok;
}//createbitree.
status printelement(char e)
{
printf("%c\n",e);
return ok;
}
status preordertraverse0(bitree t,status (*visit)(char e))//先序遍历。 DLR 递归。
{
if(t)
{
visit(t->data);
preordertraverse0(t->lchild,visit);
preordertraverse0(t->rchild,visit);
return ok;
}
else return ok;
}// preordertraverse.
status preordertraverse1(bitree t,status(*visit)(char e))//先序遍历 DLR 非递归。
{
sqstack s;
initstack(s);
bitree p=t;
while(p||!stackempty(s))
{
if(p)
{
push(s,p);
visit(p->data);
p=p->lchild;
}
else
{
pop(s,p);
p=p->rchild;
}
}
return ok;
}
status inordertraverse0(bitree t,status(*visit)(char e))//LDR 中序遍历 LDR 非递归。
{
sqstack s;
bitree p=NULL;
initstack(s);
push(s,t);
while(!stackempty(s))
{
while(gettop(s,p)&&p) push(s,p->lchild);
pop(s,p);
if(!stackempty(s))
{
pop(s,p);
if(!visit(p->data))return error;
push(s,p->rchild);
}
}
}
status inordertraverse1(bitree t,status(*visit)(char e))//中序遍历 LDR 非递归。
{
sqstack s;
initstack(s);
bitree p=NULL;
p=t;
while(p||!stackempty(s))
{
if(p)
{
push(s,p);
p=p->lchild;
}
else
{
pop(s,p);
if(!visit(p->data))return error;
p=p->rchild;
}
}
return ok;
}
status inordertraverse2(bitree t,status(*visit)(char e))//中序遍历 LDR 递归。
{
if(t)
{
inordertraverse2(t->lchild,visit);
visit(t->data);
inordertraverse2(t->rchild,visit);
}
return ok;
}
status postordertraverse1(bitree t,status(*visit)(char e))//后序遍历 非递归 LRD。
{
sqstack s;
initstack(s);
bitree p=t,f=NULL;
while(p||!stackempty(s))
{
if(p)
{
push(s,p);
p=p->lchild;
}
else
{
gettop(s,p);
if(p->rchild&&p->rchild!=f)
{
p=p->rchild;
push(s,p);
p=p->lchild;
}
else
{
pop(s,p);
visit(p->data);
f=p;
p=NULL;
}
}
}
return ok;
}
status postordertraverse0(bitree t,status(*visit)(char e))//后序遍历 LRD 递归。
{
if(t)
{
postordertraverse0(t->lchild,visit);
postordertraverse0(t->rchild,visit);
visit(t->data);
}
return ok;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐