1099. Build A Binary Search Tree (30)

来源:互联网 发布:淘宝购买流量怎么退款 编辑:程序博客网 时间:2024/06/05 17:20

题目详情: https://www.patest.cn/contests/pat-a-practise/1099

提交:这里写图片描述

提交代码:

#include <iostream>#include <algorithm>using namespace std;#define N 110typedef struct Node{    int data;    int leftChild;    int rightChild;}Node;Node node[N]; //nodes[] are numbered from 0 to n-1,and 0 is always the rootint n,weight[N];int queue[N],front,rear,level[N],top = -1;int getChildNumber( int root,int &number)  //得到以root为根节点的树中节点的个数,包括该根节点 {    if( root != -1 )    {        ++number;        getChildNumber(node[root].leftChild,number);        getChildNumber(node[root].rightChild,number);        return number;    }    return 0;}void build( int root,int *weight ){    if( root == -1 ) return ;  //没有节点直接返回     int leftNumber = 0,rightNumber = 0;    leftNumber = getChildNumber(node[root].leftChild,leftNumber);  //得到左子树的节点个数     rightNumber = getChildNumber(node[root].rightChild,rightNumber); //得到右子树的节点个数     cout<<"leftNumber is "<<leftNumber<<",rightNumber is "<<rightNumber<<endl;    cout<<"will insert "<<weight[leftNumber]<<endl;9    node[root].data = weight[leftNumber];    build(node[root].leftChild,weight); //递归左子树 ,同时改变数组的起始地址,若不改会出现问题     build(node[root].rightChild,weight+leftNumber+1); //递归右子树,同时改变数组的起始地址 }void levelOrder( int start ){    queue[++rear] = start;    while( front != rear )    {        int key = queue[++front];        if( node[key].leftChild != -1 )        {            queue[++rear] = node[key].leftChild;            }        if( node[key].rightChild != -1 )        {            queue[++rear] = node[key].rightChild;        }        level[++top] = node[key].data;    }}int main (){    cin>>n;    for( int i=0;i<n;++i )    {        int leftKid,rightKid;        cin>>leftKid>>rightKid;        node[i].leftChild = leftKid;        node[i].rightChild = rightKid;    }    for( int i=0;i<n;++i )        cin>>weight[i];    sort(weight,weight+n); //使weight数组有序 ,以便建立二叉树时使用     build(0,weight);       //建立该二叉树     rear = front = -1; //层次遍历前的初始化操作     levelOrder(0); //进行层次遍历     for( int i=0;i<=top;++i ) //输出层次遍历的序列     {        if( i == rear )            cout<<level[i]<<endl;        else            cout<<level[i]<<" ";    }    return 0;}

虽然通过了测试但是有个地方搞不懂,就是在getChildNumber()函数中,如果不加最后一句代码,即:return 0;会返回-1,这个地方不明白,希望得到大神指点!

0 0
原创粉丝点击