PAT1064 Complete Binary Search Tree 完全二叉搜索树

利用完全二叉树以及层序遍历和中序遍历的性质求解
但是转换的思路过程很复杂,我这里用图片描述,更容易理解
在这里插入图片描述
由题目给出的结点我们可以构造出这样一棵完全二叉搜索树
不难发现这棵树的中序遍历结果正好是一个递增序列(任何二叉搜索树都满足)

新建一个inorderlevelorder分别记录中序和层序遍历结果
上图中的数字也可以理解为当前结点在inorder数组中的下标位置
同样的,将这个思想转换到这棵树的层序遍历中,下图中的数字即每个结点在levelorder数组中的下标位置
在这里插入图片描述
下面开始构造这棵树
思路是:
中序遍历这颗层次序列树,其中create中传递的参数a是当前的层次序下标位置,index为当前遍历到的中序序列的位置,当递归达到边界位置时,例如上图中的7结点,它是中序遍历的第一个结点,直接令levelorder【a】=inorder【index】,然后递增index

vector<int> inorder,levelorder;
int n,index=0;
void create(int a)
{
    
    
	if(a>=n)return;
	create(2*a+1);
	levelorder[a]=inorder[index++];
	create(2*a+2);
}

AC代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> inorder,levelorder;
int n,index=0;
void create(int a)
{
    
    
    if(a>=n)return;
    create(2*a+1);
    levelorder[a]=inorder[index++];
    create(2*a+2);
}
int main()
{
    
    
    cin>>n;
    inorder.resize(n);
    levelorder.resize(n);
    for(int i=0;i<n;i++)
    {
    
    
        cin>>inorder[i];
    }
    sort(inorder.begin(),inorder.end());
    create(0);
    for(int i=0;i<n;i++)
    {
    
    
        cout<<levelorder[i];
        if(i!=n-1)cout<<" ";
        else cout<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42240667/article/details/106224470