【数据结构】遍历二叉树(前序、中序、后序)

二叉树链式结构的遍历
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。根据访问结点操作发生位置分别命名为前序/中序/后序的递归结构遍历。

  • NLR:前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
  • LNR:中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
  • LRN:后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

代码实现如下:

#include <stdio.h>
#include <assert.h>
#include <malloc.h>

struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
};

int TreeSize(struct TreeNode* root)
{
	if (root == NULL)
		return 0;
	return TreeSize(root->left) + TreeSize(root->right) + 1;
}

//二叉树的前序遍历
void _preorderTraversal(struct TreeNode* root, int* preorder, int* pindex)
{
	if (root == NULL)
		return;

	preorder[*pindex] = root->val;
	++(*pindex);

	_preorderTraversal(root->left, preorder, pindex);
	_preorderTraversal(root->right, preorder, pindex);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize){
	*returnSize = TreeSize(root);
	int* preorder = (int*)malloc(*returnSize * sizeof(int));

	int index = 0;
	_preorderTraversal(root, preorder, &index);

	return preorder;
}

//二叉树的中序遍历
void _inorderTraversal(struct TreeNode* root, int* inorder, int* pindex)
{
	if (root == NULL)
		return;

	_inorderTraversal(root->left, inorder, pindex);
	inorder[*pindex] = root->val;
	(*pindex)++;
	_inorderTraversal(root->right, inorder, pindex);
}

int* inorderTraversal(struct TreeNode* root, int* returnSize){
	*returnSize = TreeSize(root);
	int* inorder = (int*)malloc(*returnSize * sizeof(int));

	int index = 0;
	_inorderTraversal(root, inorder, &index);

	return inorder;
}

//二叉树的后序遍历
void _postorderTraversal(struct TreeNode* root, int* postorder, int* pindex)
{
	if (root == NULL)
		return;

	_postorderTraversal(root->left, postorder, pindex);
	_postorderTraversal(root->right, postorder, pindex);
	postorder[*pindex] = root->val;
	(*pindex)++;
}

int* postorderTraversal(struct TreeNode* root, int* returnSize){
	*returnSize = TreeSize(root);
	int* postorder = (int*)malloc(*returnSize * sizeof(int));

	int index = 0;
	_postorderTraversal(root, postorder, &index);

	return postorder;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值