二叉树建堆(向上调节建堆+向下调节建堆)

1.介绍

        建堆在二叉树当中有着非常重要的地位,尤其是在堆的排序当中,其中对于堆的建立过程当中又分成向下对堆进行调节和对堆作向上调节。这两种地位相当,在许多的地方各自又有相当重要的存在。本文重点讲述这两种方式来进行建堆,为后续的堆排序做一个重要的基础。

2.1.向上调节建堆

***向上调节和向下调节是 分两次写的,所以这两种形式里面的一些函数可能会有一些不同哦****

 首先我们需要建立一个数组的数据来为后续数据进入堆当中做准备。

int pHead[10] = { 9,6,3,8,5,2,7,4,1,5 };

然后我们就要建立一个和这个数组一样长度的空间,用作后续的堆来进行使用

int* BuiltHeap(void)
{
	int* Headp = (int*)malloc(N*sizeof(int));
	if (Headp == NULL)
	{
		printf("fail malloc\n");
		exit(-1);
	}

	return Headp;
}

然后我们就要将这些数据导入到堆当中,并且进行建立向上进行的小堆排序(这里需要注意的就是建立大堆和建立小堆其实原理都是差不多,只需要我们在后续的比较当中是大于号还是小于号,这里我们就以小堆为例),

void ArrComeHeap(int* pHead, int* HeadP)
{
	for (int i = 0; i < N; i++)
	{
		HeadP[i] = pHead[i];
	}

	//向上进行调节
	for (int i = 1; i < N; i++)
	{
		AdjustUp(HeadP, i);
	}
}

下面这是向上调节的具体的实现的过程

void AdjustUp(int* HeadP, int n)
{
	int child = n;
	int parent = (child - 1) / 2;
	while (child)
	{
		if (HeadP[child] > HeadP[parent])
		{
            //交换函数(注意要传地址)
			swap(&HeadP[child], &HeadP[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

经过这样的几步之后,我们就可以将以一组没有规律的一组数据就以向上调节的形式转化为小堆的形式给展现出来了。

2.2.向下调节建堆

同样我们需要建立一个数组的数据来为后续数据进入堆当中做准备

int pHead[10] = { 9,6,3,8,5,2,7,4,1,5};

然后我们就要建立一个和这个数组一样长度的空间,用作后续的堆来进行使用

int* BuiltHeap(void)
{
	int* Headp = (int*)malloc(10 * sizeof(int));
	if (Headp == NULL)
	{
		printf("fail malloc\n");
		exit(-1);
	}
	return Headp;
}

然后我们就要将这些数据导入到堆当中,并且进行建立向下进行的小堆排序

void ComeHeap(int*pHead, int* Head)
{
	for (int i = 0; i < 10; i++)
	{
		Head[i] = pHead[i];
	}

	for (int i = (10 - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(Head, i, 10);
	}
}

下面这是向下调节的具体的实现的过程

void AdjustDown(int* Head, int i, int n)
{
	int parent = i;
	int child = 2 * parent + 1;
	while (child < n)
	{
		if (Head[child + 1] < Head[child] && (child + 1) < n)
		{
			child = child + 1;
		}
		if (Head[child] < Head[parent])
		{
			swap(&Head[child], &Head[parent]);
			parent = child;
			child = 2 * parent + 1;
		}
		else
		{
			break;
		}
	}
}

这样我们就可以将堆以向下调节小堆的方式给展现出来了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值