二叉树的前/中/后序遍历

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

enum TRAVERSAL_TYPE
{
	PREORDER_TRAVERSAL,		// 先序遍历
	IN_ORDER_TRAVERSAL,		// 中序遍历
	POST_ORDER_TRAVERSAL,	// 后续遍历
};

// 二叉树结点
typedef struct BINARYTREENODE
{
	char ch;
	struct BINARYTREENODE* lChild;
	struct BINARYTREENODE* rChild;
};

void Recursion(struct BINARYTREENODE* root, const int& traverType = PREORDER_TRAVERSAL)
{
	if (root == NULL)
	{
		return;
	}

// 前、中、后序遍历无外乎根节点的访问差别,左右子树访问顺序相对不变
	switch (traverType)
	{
	case PREORDER_TRAVERSAL:
		{
			printf("%c ", root->ch);
			Recursion(root->lChild, traverType);
			Recursion(root->rChild, traverType);			
		}
		break;
	case IN_ORDER_TRAVERSAL:
		{
			Recursion(root->lChild, traverType);
			printf("%c ", root->ch);
			Recursion(root->rChild, traverType);			
		}
		break;
	case POST_ORDER_TRAVERSAL:
		{
			Recursion(root->lChild, traverType);
			Recursion(root->rChild, traverType);
			printf("%c ", root->ch);
		}		
		break;
	default:
		printf("未定义的遍历类型!\n");
		break;
	}
	
}

void CreateTest()
{
	// 创建结点
	struct BINARYTREENODE node1 = { 'A', NULL, NULL };
	struct BINARYTREENODE node2 = { 'B', NULL, NULL };
	struct BINARYTREENODE node3 = { 'C', NULL, NULL };
	struct BINARYTREENODE node4 = { 'D', NULL, NULL };
	struct BINARYTREENODE node5 = { 'E', NULL, NULL };
	struct BINARYTREENODE node6 = { 'F', NULL, NULL };
	struct BINARYTREENODE node7 = { 'G', NULL, NULL };

	// 建立结点关系
	node1.lChild = &node2;
	node1.rChild = &node3;
	node2.lChild = &node4;
	node2.rChild = &node5;
	node3.lChild = &node6;
	node3.rChild = &node7;

	printf("\n先序遍历序列:\n");
	Recursion(&node1);

	printf("\n中序遍历序列:\n");
	Recursion(&node1, IN_ORDER_TRAVERSAL);

	printf("\n后序遍历序列:\n");
	Recursion(&node1, POST_ORDER_TRAVERSAL);
}

int main()
{
	CreateTest();
	system("pause");
	return 0;
}

程序 运行截图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幻欢子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值