二叉树前序、中序以及后序遍历(递归展开图)

目录

1.二叉树前置说明

2.前序遍历

2.1函数实现

2.2递归展开图

3.中序遍历

3.1函数实现

3.2递归展开图

4.后序遍历

4.1函数实现

4.2递归展开图


1.二叉树前置说明

在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。因为我们只是为了实现二叉树遍历,所以为了降低学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树的排序。

我们创建一个树的结构体,然后实现开辟节点的函数,下面就要链接了(再写一个链接函数,这个函数调用开辟节点函数),开辟好之后就把各自链接起来,大家可以随意链接,我先给大家看看我的树,好方便后面观察递归展开图

typedef int BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType val;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}TreeNode;//创建一个树的结构体

TreeNode* BuyTreeNode(BTDataType x)//开辟节点
{
	TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
	if (node == NULL)
	{
		perror("malloc fail");
		return;
	}

	node->val = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

TreeNode* CreateTree()//调用开辟节点函数,然后把节点链接起来就好了
{
	TreeNode* node1 = BuyTreeNode(1);
	TreeNode* node2 = BuyTreeNode(2);
	TreeNode* node3 = BuyTreeNode(3);
	TreeNode* node4 = BuyTreeNode(4);
	TreeNode* node5 = BuyTreeNode(5);
	TreeNode* node6 = BuyTreeNode(6);
	TreeNode* node7 = BuyTreeNode(7);

	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node4->left = node5;
	node4->right = node6;
	node5->left = node7;

	return node1;
}

int main()
{
	TreeNode* root = CreateTree();

    return 0;
}

2.前序遍历

2.1函数实现

函数的实现很简单(因为前、中、后序的遍历函数可以说没有什么改变,只是顺序不一样),但是光看函数实现肯定不好理解,所以我们重点就在递归展开图,大家写递归的时候就可以画画图,可以更好理解(因为递归是一层一层的)

void PrevOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	printf("%d ", root->val);
	PrevOrder(root->left);
	PrevOrder(root->right);
}

 我们遍历的时候最好把NULL也打印出来,这样可以让我们更好的了解前、中、后序 。

2.2递归展开图

前序遍历是:根  左子树  右子树(访问根结点的操作发生在遍历其左右子树之前)

根据我实现的树,前序遍历是:1 2 3 NULL NULL NULL 4 5 NULL NULL 6 NULL NULL

具体看递归展开图:

(图片太大,只能截出来两种拼在一起,但是不影响阅读) 大概就是递归进去,然后return或者结束返回,因为递归就是一层一层的

(上面的红字就是对应的相对的解释,我没有把4 5 NULL NULL 6 NULL NULL画出来,因为图片太大展示不出来,但是不用担心,因为后面的和前面的递归方法都差不多) 

3.中序遍历

3.1函数实现

void InOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	InOrder(root->left);
	printf("%d ", root->val);
	InOrder(root->right);
}

3.2递归展开图

中序遍历是:左子树  根  右子树(访问根结点的操作发生在遍历其左右子树之间)

根据我实现的树,前序遍历是:NULL 3 NULL 2 NULL 1 NULL 5 NULL 4 NULL 6 NULL

具体看递归展开图:

4.后序遍历

4.1函数实现

void NextOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	NextOrder(root->left);
	NextOrder(root->right);
	printf("%d ", root->val);
}

4.2递归展开图

后序遍历是:左子树  右子树  根(访问根结点的操作发生在遍历其左右子树之后)

根据我实现的树,前序遍历是:NULL NULL 3 NULL 2 NULL NULL 5 NULL NULL 6 4 1

具体看递归展开图:

到这里递归的遍历就结束了,大家如果实在看不懂,可以边看视频边看展开图,这样可以更好理解解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值