二叉树的前序、中序、后序遍历(C语言)

二叉树的深度遍历分为前序、中序、后序遍历,它们的区别在于打印的先后顺序,我们可以将二叉树分为一些子树,root代表子树的根节点,left代表子树的左节点,right代表子树的右节点,整体就是他们打印的顺序;例如[root] [left] [right] 就是从二叉树的根节点开始,打印root,往左子树遍历,打印节点数据,当左子树为空时,往右子树遍历、打印;

前序遍历

 整体为 [root] [left] [right]。

root是根节点,left是左树,right是右树。

前序遍历步骤:

1、先遍历根节点(root),打印数据

2、访问下一个左节点(left),重复1步骤

3、左节点为NULL时,返回上一层递归,访问右节点(right),重复1步骤

4、结束遍历

图解 

 图中数字为遍历顺序;

遍历顺序: A B D E C F G

前序代码:

void preorder(struct Node* root) 
{
	if (root == NULL)
	{
		return;
	}
	printf("%d ", root->data); // 先打印数据
	preorder(root->left);  //遍历左节点
	preorder(root->right); //遍历右节点
}

 

中序遍历

整体为 [left] [root] [right]

中序遍历步骤:

1、先向左子树找到最后一个左节点,打印数据

2、返回上一层递归,打印数据

3、检查该层递归的节点是否有右节点

4、有则向下递归,重复上面操作

5、遍历结束

图解:

 

图中数字为遍历顺序;

遍历顺序: D B E A F C G

中序代码:

void inorder(struct Node* root)
{
	if (root == NULL)
	{
		return;
	}
	inorder(root->left);
	printf("%d ", root->data);
	inorder(root->right);
}

后序遍历

整体为[left] [right] [root]

后序遍历步骤:

1、找到最后一个左节点,打印

2、返回上一层递归,检查是否有右节点,有则打印

3、打印子树的根节点,返回上一层递归,重复以上步骤

4、结束遍历

图解:

图中数字为遍历顺序;

遍历顺序: D E B F G C A

后序代码:

void postorder(struct Node* root)
{
	if (root == NULL)
	{
		return;
	}
	postorder(root->left);
	postorder(root->right);
	printf("%d ", root->data);
}

完整代码:

struct Node {
	int data;
	struct Node* left;
	struct Node* right;
};

struct Node* newspot(int n)
{
	struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
	temp->data = n;
	temp->left = NULL;
	temp->right = NULL;
	return temp;
}
struct Node* Insert(struct Node* root, int x)
{
	if (root == NULL)
	{
		root = newspot(x);
	}
	else if (root->data >= x)
	{
		root->left = Insert(root->left, x);
	}
	else
	{
		root->right = Insert(root->right, x);
	}
	return root;
}

//前序遍历二叉树
void preorder(struct Node* root)
{
	if (root == NULL)
	{
		return;
	}
	printf("%d ", root->data);
	preorder(root->left);
	preorder(root->right);
}

//中序遍历二叉树
void inorder(struct Node* root)
{
	if (root == NULL)
	{
		return;
	}
	inorder(root->left);
	printf("%d ", root->data);
	inorder(root->right);
}

//后序遍历二叉树
void postorder(struct Node* root)
{
	if (root == NULL)
	{
		return;
	}
	postorder(root->left);
	postorder(root->right);
	printf("%d ", root->data);
}

int main()
{
	struct Node* root = NULL; 
	root = Insert(root,8);
	root = Insert(root,9);
	root = Insert(root,6);
	root = Insert(root,3);
	root = Insert(root,10);
	root = Insert(root,7);
	root = Insert(root, 12);
	preorder(root);
	printf("\n");
	inorder(root);
	printf("\n");
	postorder(root);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值