二叉树(前序/中序/后序遍历)

目录

前言

一、三种遍历方式?

二、遍历实现

1.前序遍历

2.中序遍历

3.后序遍历 

 4.练习

前言

       什么是二叉树遍历:按照某种特定的规则,依此对二叉树的节点进行相应的操作,并且每个节点只操作一次。


提示:以下是本篇文章正文内容,下面案例可供参考

一、三种遍历方式?

        对于一个二叉树而言,再遍历过程中将它们分为三种。根、左子树、右子树。常见的二叉树遍历有三种。下面就直接写好了二叉树的基本逻辑,重点是实现遍历逻辑。如果不懂可以看二叉树的初步认识这篇文章数据结构--二叉树的初步认识及堆的实现(降龙十八掌篇)-CSDN博客。遍历的实现也是比较简单的。

BTNode* BuyNode(BTDataType X)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("MALLOC FAIL");
		return NULL;
	}

	node->_data = X;
	node->_left = NULL;
	node->_right = NULL;
	return node;
}

BTNode* CreatBinaryTree()
{

	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);

	node1->_left = node2;
	node1->_right = node4;
	node2->_left = node3;
	node4->_left = node5;
	node4->_right = node6;
	return node1;
}

二、遍历实现

1.前序遍历

        

   先从根开始1开始遍历1的左子树,到2继续遍历2的左子树3到3遍历3的左子树为空那么返回继续遍历2的右子树还为空,继续向上走遍历1的右子树4之后遍历4的左子树5,5继续遍历它的左子树空,返回遍历右子树还为空,返回4遍历4的右子树6,6在遍历它的左右子树为空,至此遍历完成。就得到了 1 2 3 4 5 6。

   实现逻辑就是通过递归进行实现,如果访问到空那么返回上个递归前,如果访问不为空说明有节点继续访问,由于是先访问访问的根,所以是先大于根,之后是左子树,让函数先递归左子树,递归完成在递归右子树

void PerOrder(BTNode* tree)	//	前序遍历
{
	if (tree == NULL)
	{
		printf("NULL ");
		return;
	}
	printf("%d ", tree->_data);
	PerOrder( tree->_left);
	PerOrder( tree->_right);
}

 

2.中序遍历

        中序遍历也很简单,这里要主要的是4是5和6的根所以就是,当5递归完成之后,要打印它的根也就是说,打印4之后再去寻找右子树 

void InOrder(BTNode* tree)	//	中序遍历
{
	if (tree == NULL)
	{
		printf("NULL ");
		return;
	}
	InOrder( tree->_left);
	printf("%d ", tree->_data);
	InOrder(tree->_right);
}

 

3.后序遍历 

 

void PosOrder(BTNode* tree)	//	后序遍历
{
	if (tree == NULL)
	{
		printf("NULL ");
		return;
	}
	PosOrder(tree->_left);
	PosOrder(tree->_right);
	printf("%d ", tree->_data);
}

 4.练习

        求一棵树节点(树中的数据)的个数

                思路:利用前中后序都可以,定义一个变量,每次不为空++变量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值