题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805407749357568
AC代码
#include<bits/stdc++.h>
using namespace std;
int CBT[1005],a[1005],n,pos=0;
void in_order(int root)
{
if(root>n) return;
in_order(root*2);//左
CBT[root]=a[pos++];//根
in_order(root*2+1);// 右
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);//这行代码一定要有,因为是按顺序赋值的
in_order(1);
for(int i=1;i<=n;i++)
{
if(i==1) cout<<CBT[i];
else cout<<" "<<CBT[i];
}
}
代码逻辑说明
这段代码的核心就是in_order函数,inorder函数中root的顺序就是层级顺序,而CBT中的赋值顺序则是按照左根右的中序顺序通过pos赋值。这样既保证了结果按层输出(顺带满足了CBT),又能保证最后的树符合BST的条件
至于为什么是左根右,我想我要解释一下
先看代码:
in_order(root*2);//左
CBT[root]=a[pos++];//根
in_order(root*2+1);// 右
下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
数值 | 6 | 3 | 8 | 1 | 5 | 4 | 9 | 0 | 2 | 4 |
画出来的树如下:
当root=1时(值为6),它的左子节点的下标为1 * 2=2(值为3),它的右子节点的下标为1 * 2+1=3(值为8)
当root=4时(值为1),它的左子节点的下标为4 * 2=8(值为0),它的右子节点的下标为4 * 2+1=9(值为2)
所以说,这就是层序顺序的数组所包含的规律,大家尽量掌握一下