非递归遍历二叉树

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef char BElemType;
typedef struct BNode{
	BElemType data;
	struct BNode *lchild,*rchild;
}BiNode,*BiTree;

typedef struct {
	BiNode *base;
	BiNode *top;
	int stacksize;
}SqStack;
 
/*创建能装结点的栈*/
Status InitStack(SqStack **S){
	(*S)=(SqStack*)malloc(sizeof(SqStack));   /**/
	(*S)->base=(BiTree)malloc(STACK_INIT_SIZE*sizeof(BiNode));	
	if(!(*S)->base)exit(1);
	(*S)->top=(*S)->base;
	(*S)->stacksize=STACK_INIT_SIZE;
	return 0;
}

Status Push(SqStack *S,BiNode e){
	if((*S).top-(*S).base>=(*S).stacksize){
		(*S).base=(BiNode*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(BiNode));
		if(!(*S).base)exit(1);
		(*S).top=(*S).base+(*S).stacksize;
		(*S).stacksize+=STACKINCREMENT;
	}
	*S->top++=e;//先将e赋值给*S.top,  再自加1 
	return 0;
}
BiTree Pop(SqStack*S,BiTree e){
	//若栈不空,则删除S的栈顶元素,用e返回其值,并返回1,否则返回0;
	if((*S).top==(*S).base)return 0;
	e=--S->top; 
 	return e;	
}
Status StackEmpty(SqStack *S){
	if(S->base==S->top) {
		return 1;
	}else return 0;
	return 0;
}

/*创建二叉树*/
Status CreateTree(BiTree *T){
	BElemType ch;
	ch=getchar();
	if(ch=='#')(*T)=NULL;   //指针为空 
	else{
		(*T)=(BiTree)malloc(sizeof(BiNode));
		(*T)->data=ch;     //结构体访问    指针(不是指针变量)->结构体变量 
		CreateTree(&(*T)->lchild);
		CreateTree(&(*T)->rchild);  
	}
	return 1;
}

//非递归中序遍历 
Status InOrderTraverser(BiTree T){
	SqStack *S=NULL;
	InitStack(&S);
 	BiTree p;
 	int i=0;
 	p=T;
	while(p||!StackEmpty(S)){
		if(p){
			Push(S,*p);
			p=p->lchild;
		}else{
			p=Pop(S,p);
			printf("%c",p->data);
			p=p->rchild;
		}
	}
	return 1;
}
//递归中序遍历 
Status	InOrder(BiTree T){
	if(T){
		InOrder(T->lchild);
		printf("%c ",T->data);
		InOrder(T->rchild);
	}
	return 0;
}
int main(){
	BiTree T=NULL;
	printf("Create a Binary Tree\n");
	CreateTree(&T);
	printf("\nThe InOrder is:\n");
	InOrderTraverser(T);
//	InOrder(T);
	return 1;
}

 

你可能感兴趣的:(C++,c,C#)