1099. Build A Binary Search Tree (30)

1.这道题目难度不大,主要思想如下:

1)先构建二叉树(此时尚未填值)

2)输出二叉树的中序遍历地址

3)对数组进行排序

4)把数组的数输入到中序遍历地址相应的节点值中


AC代码:

//#include<string>
//#include <iomanip>
#include<vector>
#include <algorithm>
//#include<stack>
#include<set>
#include<queue>
#include<map>
//#include<unordered_set>
#include<unordered_map>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
using namespace std;

struct TreeNode{
	int val;
	TreeNode*left, *right;
	TreeNode(int x) :val(x), left(NULL), right(NULL){};
	TreeNode() :val(-1), left(NULL), right(NULL){};
};
void inOrder(TreeNode*root,vector<TreeNode*>&in)
{
	if (root != NULL)
	{
		inOrder(root->left, in);
		in.push_back(root);
		inOrder(root->right, in);
	}
}
int main(void)
{
	int n;
	cin >> n;
	if (n == 0) return 0;
	TreeNode *tree = new TreeNode[n];
	
	//建立二叉树
	for (int i = 0; i < n; i++)
	{
		int a, b;
		scanf("%d %d", &a, &b);
		if (a != -1)
			tree[i].left = &tree[a];
		if (b != -1)
			tree[i].right = &tree[b];
	}
	//读取数组
	vector<int> num(n, 0);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &num[i]);
	}
	//数组排序
	sort(num.begin(), num.end());

	//建立中序遍历数组
	vector<TreeNode*> treeAddress(0);
	inOrder(&tree[0], treeAddress);
	for (int i = 0; i < n; i++)
	{
		treeAddress[i]->val = num[i];
	}

	//进行层序遍历
	queue<TreeNode*> q;
	int count1 = 0;
	int count2 = 0;
	if (num.size() != 0)
	{
		q.push(&tree[0]);
		count1++;
	}
	vector<int> outPut(0);
	while (!q.empty())
	{
		for (int i = 0; i < count1; i++)
		{
			TreeNode* tmp = q.front(); q.pop();
			outPut.push_back(tmp->val);
			if (tmp->left != NULL)
			{
				q.push(tmp->left);
				count2++;
			}
			if (tmp->right != NULL)
			{
				q.push(tmp->right);
				count2++;
			}
		}
		count1 = count2;
		count2 = 0;
	}

	//输出结果
	for (int i = 0; i < outPut.size(); i++)
	{
		cout << outPut[i];
		if (i != outPut.size() - 1)
			cout << " ";
	}
	cout << endl;

	return 0;
}


posted @ 2015-11-22 14:05  siukwan  阅读(135)  评论(0)    收藏  举报