1099. Build A Binary Search Tree (30)

来源:互联网 发布:知柏地黄丸治疗鼻炎 编辑:程序博客网 时间:2024/05/22 00:20

    从根结点开始,每次统计根节点左边孩子节点的数目n,以此确定当前根节点的key值,应该是所有的key排序之后的数组的第n+1个值,递归构建即可。

#include <iostream>#include <cstdio>#include <vector>#include <algorithm>#include <queue>using namespace std;struct Node{int key, left, right;Node(){}Node(int k, int l, int r) : key(k), left(l), right(r){}};vector<Node> nodes;vector<int> keys;int count(int root){if(root == -1) return 0;return count(nodes[root].left) + count(nodes[root].right) + 1;}void fillKey(int root, int start){if(root == -1) return;int left = count(nodes[root].left);nodes[root].key = keys[start+left];fillKey(nodes[root].left, start);fillKey(nodes[root].right, start+left+1);}int main(){int n;scanf("%d", &n);nodes.resize(n);keys.resize(n);for(int i = 0; i < n; ++i){int l, r;scanf("%d%d", &l, &r);nodes[i] = Node(0, l, r);}for(int i = 0; i < n; ++i){scanf("%d", &keys[i]);}sort(begin(keys), end(keys));fillKey(0, 0);queue<Node> Q;Q.push(nodes[0]);vector<int> result;while(!Q.empty()){Node node = Q.front(); Q.pop();result.push_back(node.key);if(node.left != -1) Q.push(nodes[node.left]);if(node.right != -1) Q.push(nodes[node.right]);}for(size_t i = 0; i < result.size(); ++i){if(i) printf(" ");printf("%d", result[i]);}return 0;}


0 0