#include<cstdio>
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;
const int maxn = 100005;
int LT[maxn], RT[maxn];
int middle[maxn], behind[maxn];
int n,mini;

int read_per(int *a)
{
    string s;
    getline(cin, s);
    stringstream ss(s);
    int x;
    n = 0;
    while (ss >> x)a[n++] = x;
    return n > 0;
}
//构造二叉树
int bulid(int L1,int  R1,int  L2,int  R2)
{
    if (L1 > R1) return 0;
    int root = behind[R2];
    int p = L1;
    while (root != middle[p])p++;
    int cnt = p - L1;
    LT[root] = bulid(L1, p - 1, L2, L2 + cnt - 1);//递归赋值
    RT[root] = bulid(p + 1, R1, L2 + cnt, R2- 1);
    return root;//每次返回root值说明该位置的一个子节点是root
}
//最小权和
int best;
void dfs(int u, int sum)
{
    sum += u;
    if (!RT[u] && !LT[u])
    {
        if (mini > sum||(sum == mini&&u<best))
        {
            best = u;
            mini = sum;
        }
        return;
    }
    if(LT[u])dfs(LT[u], sum);//一个结点有值,一个节点无值时可以判断
    if(RT[u])dfs(RT[u], sum);
}



int main(void)
{
    while (read_per(middle))
    {
        read_per(behind);
        mini = 999999;
        bulid(0, n - 1, 0, n - 1);
        dfs(behind[n - 1], 0);
        cout << best << endl;
    }
    return 0;
}

 

posted @ 2021-02-08 16:48  loliconsk  阅读(77)  评论(0)    收藏  举报