二叉树的非递归遍历

#include<stdio.h>
#include<malloc.h>
#include<stdbool.h>
#define MAX_SIZE 10 

typedef struct BiNode{
	char ch;
	struct BiNode *lchild, *rchild;
}BiNode;

typedef struct Stack{
	BiNode * data[MAX_SIZE];				//属性:线性表 
	int size;								//属性:堆栈的实际大小 
	int top;								//属性:栈顶 
}Stack;

bool isEmpty(Stack *);
bool isFull(Stack *);

void initStack(Stack *s){
	s->size=MAX_SIZE;
	s->top=-1;
}

void push(Stack *s,BiNode *p){
	if(!isFull(s)){
		s->data[++(s->top)] = p;
	}
}

BiNode* pop(Stack *s){
	if(!isEmpty(s)){
		return s->data[s->top--];
	}
}

bool isEmpty(Stack *s){
	if(s->top == -1)
		return true;
	else
		return false;
}

bool isFull(Stack *s){
	if(s->top+1 == s->size)
		return true;
	else
		return false;
}

char getval(char *str){
	static int i=0;
	return str[i++];					//*(str+i++);
}

BiNode * create(BiNode *bt,char *str){	//创建二叉树
	char c=getval(str); 
	if(c=='#'){
		bt=NULL;
	}else{
		bt=(BiNode *)malloc(sizeof(BiNode));
		bt->ch=c;
		bt->lchild=create(bt->lchild,str);
		bt->rchild=create(bt->rchild,str);
	}
	return bt;
}

void preOrder(BiNode *bt){				//非递归前序遍历 
	BiNode *p=bt;
	Stack s;
	initStack(&s);
	while(p||!isEmpty(&s)){
		if(p){
			printf("%c",p->ch);
			push(&s,p);
			p=p->lchild;
		}else{
			BiNode *q=pop(&s);
			p=q->rchild;
		}
	}
	printf("\n");
}

void inOrder(BiNode *bt){				//非递归中序遍历 
	BiNode *p=bt;
	Stack s;
	initStack(&s);
	while(p||!isEmpty(&s)){
		if(p){
			push(&s,p);
			p=p->lchild;
		}else{
			BiNode *q=pop(&s);
			printf("%c",q->ch);
			p=q->rchild;
		}
	}
	printf("\n"); 
}

void postOrder(BiNode *bt){				//非递归后序遍历
	if(bt==NULL)
		return; 
	BiNode *p=bt;
	Stack s;
	int i=0;
	char temp[MAX_SIZE];				//将栈中弹出的元素放入数组 
	initStack(&s);
	push(&s,p);							//将根节点压入栈 
	while(!isEmpty(&s)){
		p=pop(&s);						//弹出节点
		temp[i++]=p->ch;				//将弹出节点的值放入数组 
		if(p->lchild!=NULL)
			push(&s,p->lchild);			//左子树压栈 
		if(p->rchild!=NULL)
			push(&s,p->rchild);			//右子树压栈 
	}
	while(i>0){							//倒序输出 
		printf("%c",temp[--i]);
	}
}

int main(void){
	char *str="AB#D##C##";
	BiNode * root=create(root,str);
	preOrder(root);
	inOrder(root);
	postOrder(root);
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值