二叉树的遍历 (25 分)

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
	ElementType Data;
	BinTree Left;
	BinTree Right;
};

void CreatBinTree(BinTree &T); /* 实现细节忽略 */
void InorderTraversal(BinTree BT);
void PreorderTraversal(BinTree BT);
void PostorderTraversal(BinTree BT);
void LevelorderTraversal(BinTree BT);

int main()
{
	BinTree BT;
	CreatBinTree(BT);
	printf("Inorder:");    InorderTraversal(BT);    printf("\n");
	printf("Preorder:");   PreorderTraversal(BT);   printf("\n");
	printf("Postorder:");  PostorderTraversal(BT);  printf("\n");
	printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
	system("PAUSE");
	return 0;
}
/* 你的代码将被嵌在这里 */
void CreatBinTree(BinTree &T){
	ElementType ch;
	scanf("%c", &ch);
	getchar();
	if (ch == '#')T = NULL;//空树,递归结束
	else{
		T = (BinTree)malloc(sizeof(struct TNode));
		T->Data = ch;
		CreatBinTree(T->Left);
		CreatBinTree(T->Right);
	}
	return;
}
void InorderTraversal(BinTree BT){//左根右
	if (BT != NULL){
		InorderTraversal(BT->Left);
		printf(" %c", BT->Data);
		InorderTraversal(BT->Right);
	}
	return;
}
void PreorderTraversal(BinTree BT)//根左右
{
	if (BT != NULL){
		printf(" %c", BT->Data);
		PreorderTraversal(BT->Left);
		PreorderTraversal(BT->Right);
	}
	return;
}
void PostorderTraversal(BinTree BT)//左右根
{
	if (BT != NULL){
		PostorderTraversal(BT->Left);
		PostorderTraversal(BT->Right);
		printf(" %c", BT->Data);
	}
	return;
}

//层次遍历利用了(顺序结构,因为用数组即可较为简单)队列存数
//队列先进先出的原理:1先进根;2出根,进左右孩子,此时头指针应为左孩子/(若无左孩子)右孩子)3若有左孩子也有右孩子,左孩子出队后的头指针为右孩子,所以循环步骤2就达到了层次遍历的效果
void LevelorderTraversal(BinTree BT)
{
	if (BT == NULL)return;
	BinTree Queue[1000];//队列Queue存储BinTree类型的指针地址(数组做队列即顺序结构队列)
	int front = 0,rear=0;
	//尾下标队伍元素入队,尾下标移位
	Queue[rear++] = BT;//根节点入队让队伍中有元素
	while (front<rear){//当队列中有元素时
		//队列先进先出
		//层次遍历就是:进根,让队伍中有元素;
		//出根并访问(输出),进左右;第二次循环头下标即左(若无左,则也没进左,头下标即右),左为根循环之前的操作
		
		//设置这一次的头下标为根,头下标移位
		BinTree bt = Queue[front++];
		//根出队并输出
		printf(" %c", bt->Data );
		//如果根有左孩子,左孩子进队
		if (bt->Left)
			Queue[rear++]=bt->Left;
		//如果根有右孩子,右孩子进队
		if (bt->Right)
			Queue[rear++] = bt->Right;
	}
}

0.结构体

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
	ElementType Data;
	BinTree Left;
	BinTree Right;
};

1.创建二叉树(和我写的总结中的一样)

void CreatBinTree(BinTree &T){
	ElementType ch;
	scanf("%c", &ch);
	getchar();
	if (ch == '#')T=NULL;//空树,递归结束
	else{
		T = (BinTree)malloc(sizeof(struct TNode));
		T->Data = ch;
		CreatBinTree(T->Left);
		CreatBinTree(T->Right);
	}
	return;
}

主函数

	BinTree BT;
	CreatBinTree(BT);

2.中序遍历Inorder Traversal:左根右

void InorderTraversal(BinTree BT){//左根右
	if (BT != NULL){
		InorderTraversal(BT->Left);
		printf(" %c", BT->Data);
		InorderTraversal(BT->Right);
	}
	return;
}

3.先序遍历Preorder Traversal:根左右

void PreorderTraversal(BinTree BT)//根左右
{
	if (BT != NULL){
		printf(" %c", BT->Data);
		PreorderTraversal(BT->Left);
		PreorderTraversal(BT->Right);
	}
	return;
}

4.后序遍历Postorder Traversal:左右根

void PostorderTraversal(BinTree BT)//左右根
{
	if (BT != NULL){
		PostorderTraversal(BT->Left);
		PostorderTraversal(BT->Right);
		printf(" %c", BT->Data);
	}
	return;
}

△5.层次遍历Levelorder Traversal:利用了(顺序结构,因为用数组即可较为简单)队列存数

队列先进先出的原理
1先进根;
2出根,进左右孩子,此时头指针应为左孩子/(若无左孩子)右孩子)
3若有左孩子也有右孩子,左孩子出队后的头指针为右孩子,所以循环步骤2就达到了层次遍历的效果
参考https://blog.csdn.net/hansionz/article/details/81947834
在这里插入图片描述

void LevelorderTraversal(BinTree BT)
{
	if (BT == NULL)return;
	BinTree Queue[1000];//队列Queue存储BinTree类型的指针地址(数组做队列即顺序结构队列)
	int front = 0,rear=0;
	//尾下标队伍元素入队,尾下标移位
	Queue[rear++] = BT;//根节点入队让队伍中有元素
	while (front<rear){//当队列中有元素时
		//队列先进先出
		//层次遍历就是:进根,让队伍中有元素;
		//出根并访问(输出),进左右;第二次循环头下标即左(若无左,则也没进左,头下标即右),左为根循环之前的操作
		
		//设置这一次的头下标为根,头下标移位
		BinTree bt = Queue[front++];
		//根出队并输出
		printf(" %c", bt->Data );
		//如果根有左孩子,左孩子进队
		if (bt->Left)
			Queue[rear++]=bt->Left;
		//如果根有右孩子,右孩子进队
		if (bt->Right)
			Queue[rear++] = bt->Right;
	}
}

主函数

printf("Inorder:");    InorderTraversal(BT);    printf("\n");
	printf("Preorder:");   PreorderTraversal(BT);   printf("\n");
	printf("Postorder:");  PostorderTraversal(BT);  printf("\n");
	printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值