树的(先中后,层级)遍历(递归)C语言 数据结构

树的递归遍历真的超级简单..........

前中后序无非是看打印语句(printf)的位置了,

代码如下:

#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode {           //树的节点 
	ElementType Data;   //数据域 
	BinTree Left;		//左孩子 
	BinTree Right;		//右孩子 
};


//File *fp=fopen("path","r");  也可以用文件读取序列化的树 
//char e = fgetc(fp);
BinTree CreateBitree(BinTree T) { 				//先序创建一颗二叉树
	char  e;
	scanf("%c", &e);
	if (e != '#') {   							//判断当前输入的字符
		T = (BinTree)malloc(sizeof(BinTree));	 //分配存贮空间
		T->Data = e;
		T->Left = NULL;
		T->Right = NULL;
		T->Left = CreateBitree(T->Left);		 //递归创建左孩子节点值
		T->Right = CreateBitree(T->Right); 		 //递归创建右孩子节点值
	}
	return T;
}

/*
用递归写二叉树遍历......
 printf  在前就是前序,在中就是中序,在后就是后续
*/
void InorderTraversal( BinTree BT ) {            //中序遍历 
	if(BT==NULL)return ;
	InorderTraversal(BT->Left);
	printf(" %c",BT->Data);                      //因为这个在中间,下面的同理 
	InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ) {			//先序遍历 
	if(BT==NULL)return ;
	printf(" %c",BT->Data);
	PreorderTraversal(BT->Left);
	PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ) {			//后序遍历 
	if(BT==NULL)return ;
	PostorderTraversal(BT->Left);
	PostorderTraversal(BT->Right);
	printf(" %c",BT->Data);
}

//这个是层级遍历
void LevelorderTraversal( BinTree BT ) {
	if (BT == NULL)
		return;
	BinTree binTree[100];   //数组迭代存储层序遍历的节点
	int head = 0, last = 0; //
	binTree[last++] = BT;
	while (head < last) {   //通过迭代存储和遍历节点
		BinTree temp = binTree[head++];
		printf(" %c", temp->Data);
		if (temp->Left)     //左子树存在
			binTree[last++] = temp->Left;
		if (temp->Right)    //右子树存在
			binTree[last++] = temp->Right;
	}
}

int main() {
	BinTree BT = NULL;
	BT = CreateBitree(BT);
	printf("中序:");
	InorderTraversal(BT);
	printf("\n");
	printf("先序:");
	PreorderTraversal(BT);
	printf("\n");
	printf("后序:");
	PostorderTraversal(BT);
	printf("\n");
	printf("层级:");
	LevelorderTraversal(BT);
	printf("\n");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值