非递归中序遍利 二叉数在C下实现
#define Stack_Init_Size 100 #include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <stdlib.h>
typedef struct Node
{ char data;
struct Node *LChild;
struct Node *RChild;
}BiTNode, *BiTree;
typedef struct
{
BiTree base,top; /*base=*top表示空栈*/
int stacksize; /*用来存放栈长*/
}SqStack;
const int LEN=sizeof(BiTNode);
int sign=1;
void InitStack(SqStack *S)
{
/*构造一个空栈S*/
S->top=S->base=(BiTree)malloc(Stack_Init_Size*LEN);
if(!S->base)exit(1);
S->stacksize=Stack_Init_Size;
}
void MyEQU(BiTree opa,BiTree opb)
{
opa->data=opb->data;
opa->LChild=opb->LChild;
opa->RChild=opb->RChild;
}
/*判栈空*/
int StackEmpty(SqStack S) /*判断栈S为空栈时返回值为0,反之为1*/
{
return S.base==S.top;
}
int Push(SqStack *S,BiTree x)
{
if(S->top-S->base>=S->stacksize)return 0; /*栈已满*/
MyEQU(S->top,x);
printf("%c",S->top->data);
S->top++;
return 1;
}
int Pop(SqStack *S,BiTree *x)
{
/* 将栈S的栈顶元素弹出,放到x所指的存储空间中 */
if(S->top==S->base)return 0; /*栈为空*/
else
{
S->top--;
*x=S->top;
return 1;
}
}
void CreateBiTree(BiTree *bt)
{
char ch;
if(!sign)return;
ch=getchar();
fflush(stdin);
if(ch=='$')*bt=0,sign=0;
else
{
*bt=(BiTree)malloc(LEN); /*生成一个新结点*/
(*bt)->LChild=(*bt)->RChild=NULL;
(*bt)->data=ch;
CreateBiTree(&((*bt)->LChild)); /*生成左子树*/
CreateBiTree(&((*bt)->RChild)); /*生成右子树*/
}
}
int main() /* 中序遍历二叉树的非递归算法6.3 */
{
BiTree root;
SqStack S;
BiTree p;
CreateBiTree(&root);
InitStack (&S);
p=root;
while(p||!StackEmpty(S))
{
if (p) /* 根指针进栈,遍历最左 */
{
Push(&S,p);
p=p->LChild;
}
else
{ /*根指针退栈,访问根结点,遍历右子树*/
Pop(&S,&p);
printf("this node is: %c\n",p->data);
p=p->RChild;
}
}
getch();
return 0;
}
如和改才能在C下出现正确结果呢