花了一点时间,将书本上中序遍历二叉树的非递归算法的伪代码翻译成纯c的可执行程序,算法要结合栈和树的基本操作函数。程序在vc6.0下调试通过。
代码如下:
#include
<
stdio.h
>
#include
<
stdlib.h
>
#define
STACK_INIT_SIZE 100
#define
STACKINCREMENT 10
#define
OVERFLOW -2
#define
INFEASIBLE -1
#define
ERROR 0
#define
OK 1
#define
TRUE 1
#define
FALSE 0
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef
int
TElemType;
TElemType Nil
=
0
;
typedef
struct
BiTNode
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
TElemType data;
BiTNode *lchild,*rchild;
}
BiTNode,
*
BiTree;
typedef BiTree SElemType;//注意!栈中的元素类型是什么!
struct
SqStack
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
SElemType *base;
SElemType *top;
int stacksize;
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
InitStack(SqStack
*
sq)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
sq->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!sq->base)exit(OVERFLOW);
sq->top=sq->base;
sq->stacksize=STACK_INIT_SIZE;
return OK;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
Push(SqStack
*
sq,BiTree bt)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(sq->top-sq->base>=sq->stacksize)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
sq->base=(SElemType*)realloc(sq->base,(sq->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!sq->base)exit(OVERFLOW);
sq->top=sq->base+sq->stacksize;
sq->stacksize+=STACKINCREMENT;
}
*sq->top++=bt;
return OK;
}
//
Push
int
Pop(SqStack
*
sq,BiTree
*
bt)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(sq->base==sq->top)return ERROR;
*bt=*--sq->top;
return OK;
}
//
Pop
int
StackEmpty(SqStack
*
sq)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(sq->base==sq->top)return OK;
else return ERROR;
}
//
StackEmpty
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
InitBiTree(BiTree
*
T)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
(*T)=NULL;
return OK;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CreateBiTree(BiTree
*
T)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
TElemType ch;
//BiTree *p;
//*p=*T;
scanf("%d",&ch);
if(ch==Nil)
(*T)=NULL;
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
(*T)=(BiTree)malloc(sizeof(BiTNode));
if(!(*T))
exit(OVERFLOW);
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
//return(*p);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
BiTreeEmpty(BiTree
*
T)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{ // 初始条件: 二叉树T存在
// 操作结果: 若T为空二叉树,则返回TRUE,否则FALSE
if(*T)
return FALSE;
else
return TRUE;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
InOrder(BiTree
*
root)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{/**//*中序遍历二叉树的非递归算法*/
SqStack S;
BiTree p;
InitStack(&S);
p=*root;
while(p!=NULL||!StackEmpty(&S))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(p!=NULL) //根指针进栈,遍历左子树
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Push(&S,p);
p=p->lchild;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{/**//*根指针退栈,访问根节点,遍历右子树*/
Pop(&S,&p);
printf("%d ",p->data);
p=p->rchild;
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
main()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
BiTree T;
InitBiTree(&T);
printf("请先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树) ");
CreateBiTree(&T);
printf("中序遍历输出结点的值:");
InOrder(&T);
putchar(' /n');
}