UVA

来源:互联网 发布:为什么dota2知乎 编辑:程序博客网 时间:2024/06/04 19:14

题意 : 给你一颗二叉树,给定中序和后序,求叶子结点到根结点的最小值。

思路:由中序和后序求树,然后dfs~

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <sstream>#include <queue>using namespace std;#define maxn 10010#define inf 0x3f3f3f3fint in[maxn];int pos[maxn];struct btnode{    int v,l,r;    btnode(){}    btnode(int a,int b = -1,int c = -1)    {   v = a; l = b; r = c;    }}tree[maxn];int treenum = 0;int buildtree(int i,int inum, int p,int pnum){    if(inum <= 0) return -1;    int rv = pos[p+pnum-1];    int root = treenum++;    tree[root].v = rv;    int j = i;    while(in[j] != rv && j < i+inum-1)        j++;    int lnum = j-i, rnum = i+inum-j-1;    tree[root].l = buildtree(i,lnum,p,lnum);    tree[root].r = buildtree(j+1,rnum,p+lnum,rnum);    return root;}int bfs(){    queue<int> q;    q.push(0);    while(!q.empty())    {        int temp  = q.front(); q.pop();        cout<<tree[temp].v<<' ';        if(tree[temp].l != -1)            q.push(tree[temp].l);        if(tree[temp].r != -1)            q.push(tree[temp].r);    }}int imin = inf,ans = -1;void dfs(int n,int sum){    if(tree[n].l == -1 && tree[n].r == -1)    {        if(sum < imin)            imin = sum, ans = tree[n].v;        else if(sum == imin)            imin = sum, ans = min(tree[n].v,ans);        return;    }    else    {        if(tree[n].l != -1)    dfs(tree[n].l,sum+tree[tree[n].l].v);        if(tree[n].r != -1)    dfs(tree[n].r,sum+tree[tree[n].r].v);    }}int main(){    string mid;    while(getline(cin,mid))    {        treenum = 0;        stringstream ss;        ss << mid;        int midnum = 0;        int temp;        while(ss >> temp)            in[midnum++] = temp;        for(int i = 0; i < maxn; i++)            tree[i] = btnode(0);        for(int i = 0; i < midnum; i++)            scanf("%d",&pos[i]);        getchar();        ans = -1,imin = inf;        buildtree(0,midnum,0,midnum);        dfs(0,tree[0].v);        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击