#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, BiTree;
static int i=0;
//char TDATA[]={'0','1','2','3','4','5','6','7','8','9',' ','9','8','7','6','5','4','3','2','1','0',' '};
char TDATA[]={'0','1','2','#','#','3','#','#','4','5','6','#','#','7','#','#','8','9',' ',' ','a','#','#'};
void createBiTree(BiTree **T){
char e;
e=TDATA[i++];
printf("i=%d,e=%d,e=%c\n",i,e,e);
if(i>100)
e=' ';
if(e == ' ' || e=='#')
{
*T = NULL;
}
else
{
*T = (BiTree *)malloc(sizeof(BiTNode));
if(!(*T))
{
printf("Failed memory malloc for node\n");
return;
}
(*T)->data = e;
createBiTree(&(*T)->lchild);
createBiTree(&(*T)->rchild);
}
}
void TreversePreorder(BiTree *T)
{
BiTree *stack[1000],*p=T;
int top=0;
while(p||top)
{
if(p)
{
printf("%c ",p->data);
stack[top++]=p;
p=p->lchild;
}
else
{
p=stack[--top];
p=p->rchild;
}
}
}
//Left->Rigth
void TreverseInorder(BiTree *T)
{
BiTree *stack[1000],*p=T;
int top=0;
char value=0;
while(p||top)
{
value=0;
if(p)
{
stack[top++]=p;
p=p->lchild;
if(p)
value=p->data; //For debug;
}
else
{
p=stack[--top];
value=p->data;
printf("%c ",p->data);
p=p->rchild;
}
}
}
void TreversePostorder(BiTree *T)
{
BiTree *stack[1000],*p=T,*r=NULL;
int top=0;
while(p||top)
{
if(p)
{
stack[top++]=p;
p=p->lchild;
}
else
{
p=stack[top-1];
if(p->rchild&&p->rchild!=r)//判断右子树,不为空且未被访问则需要先遍历
{
p=p->rchild;
stack[top++]=p;//当前右子树压栈
p=p->lchild;
}
else//右子树为空,则直接访问
{
p=stack[--top];
printf("%d ",p->data);
r=p;//r保存节点
p=NULL;
}
}
}
}
int main(void){
BiTree *T;
createBiTree(&T);
printf("Create Binary Tree OK!\n");
printf("\nTreversePreorder:");
TreversePreorder(T);
printf("\n\nTreverseInorder:");
TreverseInorder(T);
while(1);
}
二叉树遍历的非递归方法
最新推荐文章于 2022-12-09 18:31:27 发布