【hihocoder】1938.还原BST(层序遍历+BST)
1. 题目
小Hi有一棵二叉搜索树(BST)。小Ho想知道这颗树的结构。
小Hi为了考验一下小Ho,只告诉他这棵BST的层序遍历(从上到下、从左到右)序列。
例如如下的BST,层序遍历序列是:5, 3, 10, 1, 4, 7
5
/ \
3 10
/ \ /
1 4 7
输入
第一行包含一个整数N,代表BST的节点数目。
第二行包含N个整数A1, A2, … AN,代表BST的层序遍历序列。
1 <= N <= 100000
1 <= Ai <= 1000000
输入保证Ai两两不同且有唯一解
输出
输出N个整数,依次代表A1, A2, … AN的父节点是多少。对于根节点输出0。
样例输入
6
5 3 10 1 4 7
样例输出
0 5 5 3 3 10
2. 思路
这题可以这样做:对于一个层序遍历得到的序列,取序列中的第一个结点,将它后面的结点(层序遍历排在它后面的结点)分成两部分:比它小的(其左子树) 和 比它大的(其右子树)。其中,左子树中第一个结点就是它的左孩子,右子树中的第一个结点就是它的右孩子,这样就可以确定这两个结点的父节点了。接着,再分别对其右子树和左子树重复进行上述操作。
3. 代码
#include <stdio.h>
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
map<int, int>parent;
void createtree(vector<int>v) {
int i, j, k, l;
l = v.size();
if(l <= 1) {
return ;
}
vector<int>v1;
vector<int>v2;
v1.clear();
v2.clear();
j = v[0];
for(i=1; i<l; i++) {
k = v[i];
if(k < j) {
v1.push_back(k);
}
else {
v2.push_back(k);
}
}
if(v1.size() > 0) {
parent[v1[0]] = j;
createtree(v1);
}
if(v2.size() > 0) {
parent[v2[0]] = j;
createtree(v2);
}
}
int main() {
int n, i, j, k;
vector<int>data;
while(cin >> n) {
data.clear();
parent.clear();
for(i=0; i<n; i++) {
cin >> j;
data.push_back(j);
}
parent[data[0]] = 0;
createtree(data);
for(i=0; i<data.size()-1; i++) {
j = data[i];
cout << parent[j] << " ";
}
j = data[data.size()-1];
cout << parent[j] << endl;
}
return 0;
}