xdoj-输出快速排序递归算法隐含递归树的后序遍历序列

输出快速排序递归算法隐含递归树的后序遍历序列

描述:

快速排序递归算法隐含一棵由关键字生成的二叉树(递归树),输出该隐含二叉树的后序遍历序列。(注:划分时以第一关键字为枢轴)

输入说明:

输入数据第一行为1个正整数n,表示关键字个数。第2行为n个整数表示n个关键字。

输出说明:

在一行上输出由关键字隐含的二叉树的后序遍历序列。

输入样例:

9

49 38 65 97 13 27 49 55 4

输出样例:

27 13 38 4 49 55 65 97 49

提示

在快速排序的过程中输出隐含二叉树的后序遍历序列,不用生成二叉树。

思路:

因为在快速排序的过程中存在递归,并且是分别快速排序枢轴量的左半部分和右半部分,这和二叉树分别建立左右子树是一样的,而其中的结点值也就是枢轴量。

大家可以看看我手写的这个大概过程。

还有一点就是大家可能会有顾虑,在遍历二叉树的时候,二叉树是已经建立好的,但是快速排序是一边在排序,一边在输出,这会不会使这个过程出现问题。

我觉得重点在int pivotloc = Partition(L, low, high);这个语句,这一句话实际上已经根据此次的枢轴量排序好了,那么也就相当于这棵树左右子树已经分好了,也就相当于二叉树是建立好的,然后下来再打印左子树的枢轴量,打印右子树,打印根。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void QSort(int L[100], int low, int high);
int Partition(int L[100], int low, int high);

int main()
{
	int n;
	int i;
	int L[100] = { 0 };
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
		scanf("%d", &L[i]);
	QSort(L, 1, n);
	return 0;
}

void QSort(int L[100], int low, int high)
{
    //排序的时候可以是小于,因为最后一个数不用再处理,但是要输出,
    //故尽管不处理,也一定要进入if条件判断,来打印这个值,也就是一定要low <= high
	if (low <= high)
	{
    //这里的理解和二叉树的遍历思路是一样的,也就是先打印左边的枢轴量,
    //再打印右边的枢轴量,最后打印根的值
		int pivotloc = Partition(L, low, high);
		QSort(L, low, pivotloc - 1);//可以理解为打印左边的枢轴量
		QSort(L, pivotloc + 1, high);//打印右边的值
		printf("%d ", L[pivotloc]);//打印根的值
	}
}

int Partition(int L[100], int low, int high)
{
	L[0] = L[low];
	int pivotkey = L[low];
	while (low < high)
	{
		while (low < high && L[high] >= pivotkey)
			high--;
		L[low] = L[high];
		while (low < high && L[low] <= pivotkey)
			low++;
		L[high] = L[low];
	}
	L[low] = L[0];
	return low;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值