二叉树的创建和遍历


#include<stdio.h> 
#include <stdlib.h>
#define MAX_LEN 50
#define ElemType char
#define Status int
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef struct Node{
	ElemType data;
	struct Node *lchild,*rchild;
}BiTreeNode,*BiTree;

/*递归创建一棵二叉树*/
void CreateBiTreeByRec(BiTree &T){
	char ch;
	scanf("%c",&ch);
	if(ch=='#'){
		T = NULL;
	}else{
		if(!(T = (BiTree)malloc(sizeof(BiTreeNode)))){
			exit(OVERFLOW);
		}
		T->data = ch;
		CreateBiTreeByRec(T->lchild);
		CreateBiTreeByRec(T->rchild);
	}
}
/*前序非递归创建二叉树*/
void CreateBiTreeByPreNoRec(BiTree &T){
	char ch;
	BiTree s[MAX_LEN]={NULL},p=NULL;
	int top = 0;//栈顶指针
	scanf("%c",&ch);
	if('#'==ch){
		T = NULL;
	}else{
		if(!(T = (BiTree)malloc(sizeof(BiTreeNode)))){
			exit(OVERFLOW);
		}
		T->data = ch;
		s[++top] = T;
		p = T;
	}
	while(top!=0){
		scanf("%c",&ch);
		if(ch=='\n'){
			break;
		}
		if(ch!='#'){
			BiTree r;
			if(!(r = (BiTree)malloc(sizeof(BiTreeNode)))){
				exit(OVERFLOW);
			}
			r->data = ch;
			r->lchild = NULL;
			r->rchild = NULL;
			p->lchild = r;
			p = r;
			s[++top] = r;
		}else{
			p->lchild = NULL;
			scanf("%c",&ch);
			while(ch=='#'){
				p->rchild = NULL;
				p = s[top--];
				scanf("%c",&ch);
			}
			if(top!=0){
				p = s[top--];
				BiTree r;
				if(!(r = (BiTree)malloc(sizeof(BiTreeNode)))){
					exit(OVERFLOW);
				}
				r->data = ch;
				r->lchild = NULL;
				r->rchild = NULL;
				p->rchild = r;
				p = r;
				s[++top] = r;
			}
		}
	}
}
/*前序递归遍历*/
void PreOrderRec(BiTree &T){
	if(NULL!=T){
		printf("%c ",T->data);
		PreOrderRec(T->lchild);
		PreOrderRec(T->rchild);
	}
}
/*前序非递归遍历*/
void PreOrder(BiTree &T){
	BiTree s[MAX_LEN]={NULL},p=NULL;
	int top = 0;
	p = T;
	do{
		while(p!=NULL){
			printf("%c ",p->data);
			s[++top] = p;
			p = p->lchild;
		}
		if(top==0){
			break;
		}else{
			p = s[top--];
			p = p->rchild;
		}
	}while(1);
}
/*中序递归遍历*/
void InOrderRec(BiTree &T){
	if(T!=NULL){
		InOrderRec(T->lchild);
		printf("%c ",T->data);
		InOrderRec(T->rchild);
	}
}
/*中序非递归遍历*/
void InOrder(BiTree &T){
	BiTree s[MAX_LEN]={NULL},p=NULL;
	p = T;
	int top = 0;
	do{
		while(p!=NULL){
			s[++top] = p;
			p = p->lchild;
		}
		if(top==0){
			break;
		}else{
			p = s[top--];
			printf("%c ",p->data);
			p = p->rchild;
		}
	}while(1);
}
/*后序递归遍历*/
void PostOrderRec(BiTree &T){
	if(T!=NULL){
		PostOrderRec(T->lchild);
		PostOrderRec(T->rchild);
		printf("%c ",T->data);
	}
}
/*后序非递归遍历*/
void PostOrder(BiTree &T){
	BiTree s[MAX_LEN]={NULL},p=NULL;
	int top = 0,mark[MAX_LEN]={0};
	p = T;
	do{
		while(p!=NULL){
			s[++top] = p;
			mark[top] = 1;//第一次访问
			p = p->lchild;
		}
		if(0==top){
			break;
		}else{
			if(1==mark[top]){
				mark[top] = 2;//第二次访问
				p = s[top];
				p = p->rchild;
			}else{
				p = s[top--];
				printf("%c ",p->data);
				p = NULL;
			}
		}
	}while(1);
}
int main(){
	BiTree T;
	printf("Input BitTree Node: ");
	CreateBiTreeByPreNoRec(T);
	//	CreateBiTreeByRec(T);
	printf("========递归========\n");
	printf("先序遍历:");
	PreOrderRec(T);
	printf("\n中序遍历:");
	InOrderRec(T);
	printf("\n后续遍历:");
	PostOrderRec(T);
	printf("\n========非递归========\n");
	printf("先序遍历:");
	PreOrder(T);
	printf("\n中序遍历:");
	InOrder(T);
	printf("\n后续遍历:");
	PostOrder(T);
	printf("\n");
	return 0;
}


验证:

     A

/ \

B C

/ \

D H

\

E

/\

F G


运行结果:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值