PAT-Build A Binary Search Tree

来源:互联网 发布:win查看端口占用 编辑:程序博客网 时间:2024/06/03 23:49
  • 原题链接:Build A Binary Search Tree
  • 题目大意:给你一个数组,让你将其按照指定的二叉搜索树的结构排序,最后输出这颗二叉搜索树的层次序遍历结果。
  • 解法:原以为还需要我们自己手写二叉搜索树的构建,最后才发现不用,我们只要将这个数组排好序,再对号入座到响应的位置,然后输出遍历结果就好。那我们怎么找到相应的位置呢?
    • 我们可以找到二叉树中每个节点对应的value值,怎么找呢?
    • 我们知道二叉搜索树有下面的性质:右边的点的值都小于它,左边的值都大于它。
    • 所以我们只要就确定右边该节点在中序遍历中属于第几个就可以了。因为对二叉搜索树进行中序遍历就是一个有序的序列。
    • 假设已经排好序的数组是sorted,该节点在中序遍历中属于第i个,则该节点对应的值就是sorted[i]
    • 分析到这里,我们其实就把问题更抽象一步如下:给你一个有序的数列和一颗二叉树的结构,输出这颗二叉搜索树的层次序遍历结果。或者是给定一颗二叉搜索树的结果和中序遍历的结果,输出这颗二叉树的层次序遍历结果。
  • 代码如下:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int max_n = 105;int lchild[max_n];int rchild[max_n];int parent[max_n];int value[max_n];void init(){    for(int i=0;i<max_n;i++)    {        lchild[i] = rchild[i] = parent[i] = -1;    }}void display(int root){    queue<int> q;    q.push(root);    while(!q.empty())    {        int cur_root = q.front();        q.pop();        int lindex = lchild[cur_root];        int rindex = rchild[cur_root];        if(lindex != -1)        {            q.push(lindex);        }        if(rindex != -1)        {            q.push(rindex);        }        if(q.empty())            cout<<value[cur_root];        else            cout<<value[cur_root]<<" ";    }}int calu_lchild_num(int root){    int res = 0;    if(root == -1)        return res;    res += 1;    int lindex = lchild[root];    int rindex = rchild[root];    res += calu_lchild_num(lindex);    res += calu_lchild_num(rindex);    return res;}void update_value(int root, const int* sort_value, int start){    if(root == -1)    {        return ;    }    int index = calu_lchild_num(lchild[root]);    value[root] = sort_value[index + start];    // cout<<"root is "<<root<<" lchild number is "<< index+start <<" value is "<<value[root]<<endl;    int lindex = lchild[root];    int rindex = rchild[root];    update_value(lindex, sort_value, start);    update_value(rindex, sort_value, start + index + 1);}int main(){    init();    freopen("/home/give/PAT/BuildABinarySearchTree.txt", "r", stdin);    int n;    cin>>n;    for(int i=0;i<n;i++)    {        cin>>lchild[i]>>rchild[i];        parent[lchild[i]] = i;        parent[rchild[i]] = i;    }    int copy_value[max_n];    for(int i=0;i<n;i++)    {        cin>>value[i];        copy_value[i] = value[i];    }    sort(copy_value, copy_value+n);    //build_BST(0);    update_value(0, copy_value, 0);    display(0);    return 0;}
原创粉丝点击