04-树6 Complete Binary Search Tree

本文介绍了一种通过排序数组构建并打印出完全二叉树遍历序列的方法。该算法首先对输入数组进行排序,然后递归地构建完全二叉树的节点,并将根节点值保存在树形数组中。最后按顺序打印出树形数组,得到完全二叉树的遍历序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b);
void Solve(int ALeft, int ARight, int TRoot, int A[], int T[]);
int Get_Left_Nodes(int n);
int Min(int a, int b);

int main(int argc, char const *argv[])
{
	// freopen("test.txt", "r", stdin);
	int N, tmp;
	scanf("%d", &N);
	int A[N], T[N];
	for (int i = 0; i < N; ++i){
		scanf("%d", &tmp);
		A[i] = tmp;
	}
	qsort(A, N, sizeof(int), compare);
	int ALeft = 0, ARight = N -1, TRoot = 0;
	Solve(ALeft, ARight, TRoot, A, T);
	for (int i = 0; i < N; ++i){
		if(i == 0){
			printf("%d", T[i]);
		}
		else
			printf(" %d", T[i]);
	}
	return 0;
}

int compare(const void *a, const void *b)
{
	return *(int*)a - *(int*)b;
}

void Solve(int ALeft, int ARight, int TRoot, int A[], int T[])
{
	int n;
	n = ARight - ALeft + 1; //结点数n
	if(n == 0)
		return;
	int L, LeftTRoot, RightTRoot;
	L = Get_Left_Nodes(n); //计算出n个结点的完全二叉树的左子树的结点个数
	T[TRoot] = A[ALeft + L];
	LeftTRoot = TRoot * 2 + 1;
	RightTRoot = LeftTRoot + 1;
	Solve(ALeft, ALeft + L - 1, LeftTRoot, A, T);
	Solve(ALeft + L + 1, ARight, RightTRoot, A, T);//Aleft不要忘了+1 
}

int Get_Left_Nodes(int n)
{
	int H = 0, tmp = 1, X, L;//X为左子树最下一层的结点数 
	int N = n;
	while(N > 1){
		N /= 2;
		H++;//树的高度
	}
	for (int i = 0; i < H - 1; ++i){
		tmp *= 2;
	}
	X = n - 2 * tmp + 1;
	X = Min( X, tmp );
	L = tmp - 1 + X;
	return L;
}

int Min(int a, int b)
{
	return (a < b) ? a : b;
}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值