1064.Complete Binary Search Tree

【题意】
        给出一个BST的所有元素,要求这个BST同时是完全二叉树,输出这个二叉树的层先遍历序列

【思路】

        对于一个完全二叉树,总的节点数给出后左右子树的节点数就确定了,再结合BST的中序遍历是递增数列的特性,就可以递归地建树了。层先遍历自然是借助队列实现


#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;

vector<int> numbers;

typedef struct node{
	int value;
	node *left;
	node *right;
}BiNode;

void nodeCnt(int n, int *leftCnt, int *rightCnt){
	int h;

	h = (int)(log(n*1.0)/log(2.0))+1;
	if(h==1){
		*leftCnt = *rightCnt = 0;
	}
	else{
		if(3*pow(2.0,h-2)-1>=n){
			*rightCnt = pow(2.0,h-2)-1;
			*leftCnt = n-1-*rightCnt;
		}
		else{
			*leftCnt = pow(2.0,h-1)-1;
			*rightCnt = n-1-*leftCnt;
		}
	}
}

BiNode *buildTree(int leftIndex, int rightIndex){
	int n,leftCnt,rightCnt;
	BiNode *father;

	n = rightIndex-leftIndex+1;
	father = (BiNode*)malloc(sizeof(BiNode));
	nodeCnt(n,&leftCnt,&rightCnt);
	father->value = numbers[leftIndex+leftCnt];
	if(leftCnt==0){
		father->left = NULL;
	}
	else{
		father->left = buildTree(leftIndex,leftIndex+leftCnt-1);
	}
	if(rightCnt==0){
		father->right = NULL;
	}
	else{
		father->right = buildTree(rightIndex-rightCnt+1,rightIndex);
	}
	return father;
}

int main(int argc, char const *argv[])
{
	int n;

	cin >> n;
	numbers.resize(n);
	for(int i=0; i<n; i++){
		cin >> numbers[i];
	}
	sort(numbers.begin(),numbers.end());

	BiNode *head = buildTree(0,n-1);

	bool first = true;
	queue<BiNode*> qq;
	qq.push(head);
	while(!qq.empty()){
		if(first){
			first = false;
		}
		else{
			cout << " ";
		}
		cout << qq.front()->value;
		if(qq.front()->left!=NULL){
			qq.push(qq.front()->left);
		}
		if(qq.front()->right!=NULL){
			qq.push(qq.front()->right);
		}
		qq.pop();
	}

	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值