1099. Build A Binary Search Tree (30)

来源:互联网 发布:nginx 二级域名 转发 编辑:程序博客网 时间:2024/05/18 02:49

1、先递归计算每一个节点两边孩子的数量
2、然后对给的序列排序
3、然后根据两边孩子的数量就可以确定这个节点在序列中的位置,然后递归的确定就好了
4、最后层序遍历一遍

#include <iostream>#include <algorithm>#include <queue>#define SIZE 100using namespace std;int treetable[SIZE],treenum[SIZE];struct tree{    int left,right,leftnum,rightnum;} node[SIZE];queue<int>q;int CountChild(int s){    if(node[s].left == -1&&node[s].right == -1)        node[s].leftnum = node[s].rightnum = 0;    else if(node[s].left == -1){        node[s].leftnum = 0;        node[s].rightnum = CountChild(node[s].right) + 1;    }    else if(node[s].right == -1){        node[s].rightnum = 0;        node[s].leftnum = CountChild(node[s].left) + 1;    }    else {        node[s].leftnum = CountChild(node[s].left) + 1;        node[s].rightnum = CountChild(node[s].right) + 1;    }    return node[s].leftnum + node[s].rightnum;}void BuildTree(int s,int begin){    treetable[s] = treenum[begin + node[s].leftnum];    if(node[s].left!=-1)        BuildTree(node[s].left,begin);    if(node[s].right != -1)        BuildTree(node[s].right,begin + node[s].leftnum + 1);}int main() {    freopen("/Users/andyyang/ClionProjects/helloworld/1.in","r",stdin);    int numofnode;    scanf("%d",&numofnode);    for(int i = 0;i<numofnode;i++)    {        scanf("%d%d",&node[i].left,&node[i].right);        node[i].leftnum = node[i].rightnum = 0;    }    for(int i = 0;i<numofnode;i++)        scanf("%d",&treenum[i]);    sort(treenum,treenum+numofnode);    CountChild(0);    BuildTree(0,0);    int qtable[SIZE],count = 0,idx;    q.push(0);    while(q.size()){        idx = q.front();        q.pop();        qtable[count++] = treetable[idx];        if(node[idx].left!=-1)            q.push(node[idx].left);        if(node[idx].right != -1)            q.push(node[idx].right);    }    for(int i = 0;i<numofnode;i++)    {        if(i == numofnode - 1)            printf("%d\n",qtable[i]);        else printf("%d ",qtable[i]);    }    return 0;}
0 0
原创粉丝点击