1099. Build A Binary Search Tree (30)

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

提交:这里写图片描述

提交代码:

#include <iostream>
#include <algorithm>
using namespace std;
#define N 110
typedef 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 root
int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值