PAT a1138

目的:根據先序和中序,給出後序遍歷的第一個節點。

輸入:

N  <= 50000 結點數字

先序序列

中序序列

輸出:

後序序列的第一個數字。

算法:

後序遍歷的第一個點,是最左下方的點。

若當前點有左子樹,那麼就在左子樹中找第一個點。如果沒有左子樹,就在右子樹中找。如果左右子樹都沒有,則當前點就是找到的點。

#include<stdio.h>
#include<vector>

using namespace std;

vector<int> preorder,inorder;
int n;

void findfirstkey(int prel,int prer,int inl,int inr)
{
    if(prel==prer)
    {
        printf("%d",preorder[prel]);
        return;
    }
    int k = preorder[prel];
    int u = -1;
    for(int i=inl;i<=inr;i++)
    {
        if(k == inorder[i])
        {
            u = i;
            break;
        }
    }
    int leftnum = u-inl;
    if(leftnum!=0)
    {
        findfirstkey(prel+1,prel+leftnum,inl,inl+leftnum-1);
    }else
    {
        findfirstkey(prel+1,prer,inl+1,inr);
    }
}
int main()
{
    scanf("%d",&n);

    preorder.resize(n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&preorder[i]);
    }

    inorder.resize(n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&inorder[i]);
    }
    findfirstkey(0,n-1,0,n-1);
    return 0;
}

反思:

有些手生

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章