数据结构——实现树的遍历

C语言实现先序、中序、后序遍历一颗二叉树

#include
#include

#define null 0

int counter=0;

typedef struct btreenode	/*定义结构体*/
{
	int data;			//树的值 
	struct btreenode *lchild;		//左子树 
	struct btreenode *rchild;		//右子树 
}bnode; bnode *p;

bnode *creat(int x, bnode *lbt, bnode *rbt){
/*生成一棵以 x 为根结点,以 lbt 和 rbt 为左右子树的二叉树*/
	bnode *p;		//空树声明 
	p = (bnode*)malloc(sizeof(bnode));		//根据这棵树的结构分配空间 
	p -> data = x;			//当前结点的树的内容的地址指向x的地址,即值为x地址取值
	p -> lchild = lbt; 		//左子树地址存储 
	p -> rchild = rbt;		//右子树地址存储 
	return(p);			//将得到的这颗完整的树返回 
}

bnode *ins_lchild(bnode *p, int x){ 		/*作为左孩子插入到二叉树中*/
	bnode *q;		//用于临时存储的树
	if(p == null)
		printf("illegal insert");		//不能将一颗空树插入 
		/**
		 * 当这棵树(要作为父树的树)存在时, 
		 * 先对临时这颗树初始化:开空间、赋值、他的左右子树 
		 */
	else{
		q = (bnode*)malloc(sizeof(bnode));			//
		q -> data = x;			// 			存储树值 
		q -> lchild = null;			//这棵树的左孩子为地址0,可理解不存在? 
		q -> rchild = null;			//同上 
		
	if(p -> lchild != null)			//如果这一颗树有 有左孩子, 
	/*若 p 有左孩子,则将原来的左孩子作为结点 x 的右孩子*/
		q -> rchild = p -> lchild;			//左右孩子 
		p -> lchild = q;	/*x 作为 p 的左孩子*/
	}
}

bnode *ins_rchild(bnode *p, int x){	/*作为右孩子插入到二叉树中*/
	bnode *q;
	if(p == null)
		printf("illegal insert");
	else{
		q=(bnode*)malloc(sizeof(bnode));
		q -> data = x;
		q -> lchild = null;
		q -> rchild = null;
	if(p -> rchild != null)
	/*若 p 有右孩子,则将原来的右孩子作为结点 x 的左孩子*/ 
		q -> lchild = p -> rchild;
		p -> rchild = q;	/*x 作为p 的右孩子*/
	}
}

void prorder(bnode *p){/*输出二叉树的结构*/
	if(p == null)
		return;
	printf("%d\t%u\t%d\t%u\t%u\n", ++counter, p, p -> data, p -> lchild, p -> rchild);
	if(p -> lchild != null)
		prorder(p -> lchild); 
	if(p -> rchild != null)
		prorder(p -> rchild);
}


void preorder(bnode *p){	/*前序遍历二叉树*/
	if(p == NULL)		//树不为空 
		return;
	printf("%d", p -> data);		//访问结点的数据域 
	preorder(p -> lchild);
	preorder(p -> rchild);	
}
void inorder(bnode *p){	/*中序遍历二叉树*/
	if(p == NULL)
		return;
	inorder(p -> lchild);
		printf("%d", p -> data);
	inorder(p -> rchild);
}
void postorder(bnode *p){	/*后序遍历二叉树*/
	if(p == NULL)
		return;
	postorder(p -> lchild);
	postorder(p -> rchild);
	printf("%d", p -> data);

}

void main() {
	bnode *bt,*p,*q;
	int x;
	printf("Input root:");	/*输入根结点值*/
	scanf("%d",&x);
	p=creat(x,null,null);	/*建立一个只有根结点的二叉树*/ bt=p;	/*使 bt,p 都指向根结点*/
	scanf("%d",&x);	/*输入新的结点值*/
	while(x!=-1){	/*建立排序二叉树*/ 
		p = bt;
		q = p;
		while(x!=p->data&&q!=null){/*q 记录当前根结点*/
			p=q;
			if(x<p->data)
				q=p->lchild;
			else
				q=p->rchild;
			
			}
		if(x==p->data){
			printf("The data is exit.");
			return;
		}
		else
			if(x<p->data)
				ins_lchild(p,x);
		else
		 	ins_rchild(p,x);
		scanf("%d",&x);
	}
	p=bt;
	printf("structure of the binary tree:\n"); 
	printf("number\taddress\tdata\tlchild\trchild\n"); 
	prorder(p);/* 输 出 */ 
	printf("preorder:");
	preorder(p); 
	printf("\n");
	printf("inorder:");
	inorder(p); 
	printf("\n"); 
	printf("postorder:"); 
	postorder(p); 
	printf("\n");
}

你可能感兴趣的:(数据结构)