1099. Build A Binary Search Tree (30)

来源:互联网 发布:淘宝介入后对卖家影响 编辑:程序博客网 时间:2024/05/01 00:54

1099. Build A Binary Search Tree (30)


A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
  • Both the left and right subtrees must also be binary search trees.

    Given the structure of a binary tree and a sequence of distinct integer keys, there is only one way to fill these keys into the tree so that the resulting tree satisfies the definition of a BST. You are supposed to output the level order traversal sequence of that tree. The sample is illustrated by Figure 1 and 2.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives a positive integer N (<=100) which is the total number of nodes in the tree. The next N lines each contains the left and the right children of a node in the format "left_index right_index", provided that the nodes are numbered from 0 to N-1, and 0 is always the root. If one child is missing, then -1 will represent the NULL child pointer. Finally N distinct integer keys are given in the last line.

    Output Specification:

    For each test case, print in one line the level order traversal sequence of that tree. All the numbers must be separated by a space, with no extra space at the end of the line.

    Sample Input:
    91 62 3-1 -1-1 45 -1-1 -17 -1-1 8-1 -173 45 11 58 82 25 67 38 42
    Sample Output:
    58 25 82 11 38 67 45 73 42
  • 【自己写的没有AC的代码】

  • 我的想法比较暴力:先序建树;数组排序;中序填数;层序输出

  • #include <iostream>using namespace std;#include <vector>#include <algorithm>#include <queue>vector<int> arr;//值组int n;int value;//赋值时用int i;struct Node{int data;int lchild;int rchild;};typedef struct Node Node;void PreOrderTravel(Node* bst,int index){if(index!=-1){cin>>bst[index].lchild>>bst[index].rchild;PreOrderTravel(bst,bst[index].lchild);PreOrderTravel(bst,bst[index].rchild);}else return;}void InOrderTravel(Node* bst,int index){if(bst[index].lchild!=-1){//左到头InOrderTravel(bst,bst[index].lchild);}bst[index].data=arr[value++];if(bst[index].rchild!=-1){InOrderTravel(bst,bst[index].rchild);}}void LevelOrderTravel(Node* bst){queue<Node> q;Node node=bst[0];q.push(node);while(!q.empty()){node=q.front();q.pop();cout<<node.data;if(++i!=n){cout<<" ";}if(node.lchild!=-1){q.push(bst[node.lchild]);}if(node.rchild!=-1){q.push(bst[node.rchild]);}}}int main(){cin>>n;Node* bst=new Node[n];//顺序表存储PreOrderTravel(bst,0);//先序建树int a;for(int i=0;i<n;i++){cin>>a;arr.push_back(a);}sort(arr.begin(),arr.end());//对数进行排序value=0;InOrderTravel(bst,0);//中序填数i=0;LevelOrderTravel(bst);//层序输出system("pause");}

  • 测试点

    测试点结果用时(ms)内存(kB)得分/满分0答案正确338418/181答案错误33840/32答案正确23843/33答案正确23841/14答案错误33840/5

  • 【据说AC的代码】

    #include <iostream>#include <algorithm>#include <queue>using namespace std;int Left[105];int Right[105];int a[105];int b[105];void DFS(int now ,int &x){    if(now < 0)        return;    DFS(Left[now],x);    b[now] = a[x++];    DFS(Right[now],x);}int main(){    int N ;    cin >> N;    for(int i = 0; i < N ; i ++){        cin >> Left[i] >> Right[i];    }    for(int i = 0; i < N ; i ++){        cin >> a[i];    }    sort(a,a+N);    int n = 0;    DFS(0,n);    queue<int> q;    q.push(0);    vector<int> answer;    while(!q.empty()){        int node = q.front();        q.pop();        answer.push_back(b[node]);        if(Left[node] != -1) q.push(Left[node]);        if(Right[node] != -1) q.push(Right[node]);    }    for(int i = 0; i < answer.size(); i ++){        cout << answer[i] << (i == answer.size() - 1?"":" ");    }    return 0;}

  • 0 0
    原创粉丝点击