04-树6 Complete Binary Search Tree (30 分)

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:

The left subtree of a node contains only nodes with keys less than the node’s key.
The right subtree of a node contains only nodes with keys greater than or equal to the node’s key.
Both the left and right subtrees must also be binary search trees.
A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from left to right.

Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT. You are supposed to output the level order traversal sequence of this BST.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and are no greater than 2000.

Output Specification:

For each test case, print in one line the level order traversal sequence of the corresponding complete binary search tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.

Sample Input:

10
1 2 3 4 5 6 7 8 9 0

Sample Output:

6 3 8 1 5 7 9 0 2 4

这道题看着挺麻烦,如果直接去画这么一颗树会非常复杂,所以我使用了观察法(找规律)

首先从给出的sample出发,因为output为层序遍历,并且这是一颗完全二叉树,最后一层必须从左向右排满,我们很容易画出这棵树
在这里插入图片描述
容易知道,我们每一层的节点数都是可以求的
而对于二叉搜索树(BST)其中序遍历一定是从小到大的排序
所以我们依次从最后一层向上看,每一层相邻的两个节点在位置上一定间隔一个
在这里插入图片描述
对于剩下的结点,依次执行相同的操作即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码如下

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<math.h>

void sort(int* a, int n)
{
	int i, j, isordered, temp;
	for (j = n; j > 1; --j)
	{
		isordered = 1;
		for (i = 0; i < j - 1; ++i)
		{
			if (a[i] > a[i + 1])
			{
				temp = a[i + 1];
				a[i + 1] = a[i];
				a[i] = temp;
				isordered = 0;
			}
		}
		if (isordered == 1)
			break;
	}
}

int makelevelt(int a[], int c[], int n, int lentha)
//lentha为当前未排序节点数,n为本次排序节点数,返回剩余节点数
{	
	int i, j;
	int b[1000];
	for (i = 0; i < n; i++)
	{
		c[lentha-n+i] = a[i * 2];
		a[i * 2] = -1;
	}
	for (i = 0,j = 0; i < lentha; ++i)
	{
		if (a[i] != -1)
		{
			b[j++] = a[i];
		}
	}
	for (i = 0; i < lentha - n; ++i)
	{
		a[i] = b[i];
	}
	return lentha - n;
}

int main()
{
	int n, i, x;
	int a[1000], c[1000];	//a中存储代排序序列,c中存储输出序列

	scanf("%d", &n);
	for (i = 0; i < n; ++i)
	{
		scanf("%d", &x);
		a[i] = x;
	}

	sort(a, n);//对输入进行排序
	int layercoutn;
	layercoutn = log(n) / log(2) + 1; //计算总层数
	int lastlayersum, lentha;
	lentha = n; //lentha为a中剩余节点数
	lastlayersum = n - (pow(2, layercoutn - 1) - 1); //最后一次节点数
	lentha = makelevelt(a, c, lastlayersum, lentha);
	for (i = layercoutn-1; i > 0; --i)
		lentha = makelevelt(a, c, pow(2, i - 1), lentha);
	for (i = 0; i < n - 1; ++i)
		printf("%d ", c[i]);
	printf("%d", c[n - 1]);

	return 0;
}

另外有人推荐个画图的工具吗,画这几个图可把我难死了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值