PAT (Advanced Level) Practice - 1099 Build A Binary Search Tree(30 分)

题目链接:点击打开链接

题目大意:略。

解题思路:

  1. 给出“固定结构”的二叉搜索树,然后给出树中的数组,要求还原这棵树;
  2. 将数组从小到大排列正好是二叉搜索树的中序遍历结果,因此可以借此来还原整棵树;
  3. 树还原之后,就可以利用队列轻松的进行层序遍历了。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

struct node
{
    int val,l,r;
};

int n,k,f;
vector<int> val;
vector<node> tree;

void inOrder(node &rt)
{
    if(rt.l!=-1) inOrder(tree[rt.l]);
    rt.val=val[k++];
    if(rt.r!=-1) inOrder(tree[rt.r]);
}

void bfs(node rt)
{
    f=1;
    queue<node> q;
    while(!q.empty()) q.pop();
    q.push(rt);

    while(!q.empty())
    {
        rt=q.front(); q.pop();
        if(f){f=0; printf("%d",rt.val);}
        else printf(" %d",rt.val);
        if(rt.l!=-1) q.push(tree[rt.l]);
        if(rt.r!=-1) q.push(tree[rt.r]);
    }
}

int main()
{
    while(~scanf("%d",&n))
    {
        tree.resize(n); val.resize(n); k=0;
        for(int i=0;i<n;i++) scanf("%d%d",&tree[i].l,&tree[i].r);
        for(int i=0;i<n;i++) scanf("%d",&val[i]);

        sort(val.begin(),val.end());
        inOrder(tree[0]);
        bfs(tree[0]);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dream_Weave/article/details/81388676