主题:[讨论]请问二叉树的后序非递归算法怎么写啊
姓何的66
[专家分:0] 发布于 2006-12-03 11:55:00
请问二叉树的后序非递归算法怎么写啊
回复列表 (共1个回复)
沙发
kzq1985 [专家分:0] 发布于 2006-12-04 23:08:00
里面有递归和非递归的中序遍历,自己看着改,很简单的...
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define S_INIT_SIZE 100 //存储空间初时分配量
#define SINCREMENT 10 //存储空间分配增量
typedef int Status;
typedef struct BTNode
{ //二叉树的二叉链表存储表示
char data;
struct BTNode *lchild,*rchild; //左右孩子指针
}BTNode,*BT;
typedef struct
{ BT *base;
BT *top; //栈顶指针
int stacksize; //当前已经分配的存储空间,以元素为单位
}SqS;
Status InitS(SqS &S)
{ //构造一个空栈
S.base=(BT *)malloc(S_INIT_SIZE*sizeof(BT));
if(!S.base) exit(OVERFLOW); //存储分配失败
S.top=S.base;
S.stacksize=S_INIT_SIZE;
return OK;
}//InitS
Status Gettop(SqS S, BT &e)
{ if(S.top==S.base) return ERROR;
e=*(S.top-1);
return OK;
}//Gettop
Status Push(SqS &S,BT e)
{ //插入元素为e的栈顶元素
if(S.top-S.base>=S.stacksize)
{ //栈满,追加存储空间'
S.base=(BT *)realloc(S.base,(S.stacksize+SINCREMENT)*sizeof(BT));
if(!S.base) exit(OVERFLOW); //存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=SINCREMENT;
}
*S.top++=e;
return OK;
}//Push
Status Pop(SqS &S,BT &e)
{ if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}//Pop
Status SEmpty(SqS S)
{ if(S.top==S.base) return OK;
return ERROR;
}//SEmpty
Status CreatBT(BT &T)
{ //构造二叉链表表示的二叉树
char ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else
{ if(!(T=(BTNode *)malloc(sizeof(BTNode)))) exit(OVERFLOW);
T->data=ch; //生成跟结点
CreatBT(T->lchild); //构造左子树
CreatBT(T->rchild); //构造右子树
}
return OK;
}//CreatBT
Status Output(char e)
{ printf("%c ",e);
return OK;
}
Status Inorder(BT T,Status(*Output)(char ch))
{ BT p; SqS S;
InitS(S); p=T;
while(p||!SEmpty(S))
{ if(p){Push(S,p); p=p->lchild;}//根指针进栈,遍历左子树
else
{ //根指针退栈,访问根结点,遍历右子树
Pop(S,p); if(!Output(p->data)) return ERROR;
p=p->rchild;
}// else
}//while
return OK;
}//Inorder
Status Traverse(BT T,Status(*Output)(char ch))
{
if(T)
{
if(Traverse(T->lchild,Output))
if(Output(T->data))
if(Traverse(T->rchild,Output)) return OK;
return ERROR;
}
else return OK;
}//Traverse
void main()
{ BT T;
printf("请出入:");
CreatBT(T);
printf("递归输出:");
Traverse(T,Output);
printf("\n");
printf("非递归输出:");
Inorder(T,Output);
printf("\n");
}
我来回复