PAT 1064. Complete Binary Search Tree

http://pat.zju.edu.cn/contests/pat-a-practise/1064


将输入排序,dfs二分遍历即可。

写了好一会儿。二分搜索基础真是太差了,要多练习:(


代码:

#include <algorithm>
#include <cstdio>
#include <list>
#include <cmath>

using namespace std;

const int MAX = 1005;
int n, tmp, num[MAX];
list<int> level[15];

void dfs(int left, int right, int l)
{
	if (left >= right)
	{
		return ;
	}

	int mid;
	int total_level = ceil( log(right-left+1) / log(2) - 0.000001); // 1
	int bottom = (right-left) - pow(2, total_level-1) + 1;    // 
	if (bottom <= ceil(pow(2, total_level-1) - 0.000001) / 2)
	{
		mid = left + (ceil(pow(2,total_level-1)-0.000001)-1)/2 + bottom;
	} else
	{
		mid = left + (ceil(pow(2,total_level-1)-0.000001)-1)/2 + ceil(pow(2,total_level-1)-0.000001)/2;
	}
	level[l].push_back( num[mid] );
	++ l;
	dfs(left, mid, l);
	dfs(mid+1, right, l);
}

int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; ++ i)
	{
		scanf("%d", &tmp);
		num[i] = tmp;
	}
	sort(num, num + n);

	dfs(0, n, 0);

	bool first = true;
	for (int i = 0; i < 15; ++ i)
	{
		for (auto it = level[i].begin(); it != level[i].end(); ++ it)
		{
			if (first)
			{
				printf("%d", *it);
				first = false;
			} else
			{
				printf(" %d", *it);
			}
		}
	}

	return 0;
}


你可能感兴趣的:(Algorithm,C++,search,DFS,pat)