题目详情: 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,这个地方不明白,希望得到大神指点!