首页 > 其他 > 详细

树(Tree,UVA 548)

时间:2018-08-25 10:42:42      阅读:227      评论:0      收藏:0      [点我收藏+]

题目描述:

技术分享图片

题目思路:

1.使用数组建树 //递归

2.理解后序遍历和中序遍历,建立左右子树

3.dfs深度搜索找出权重最小的路径

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;

const int maxv = 10000 + 10;
int in_order[maxv], post_order[maxv], lch[maxv], rch[maxv];
int i;

bool readlist(int* t){ //读入输入 
    string line;
    if(!getline(cin,line)) return false ;
    stringstream ss(line);
    i = 0;
    int x;
    while(ss >> x) t[i++] = x;    
    return i > 0 ;
}

int buildtree(int L1, int R1, int L2, int R2){//将读入的两行建树 
    if(L1 > R1) return 0; // 空树
    int root = post_order[R2] ;//后序遍历最后一个
    int p = L1;
      while(in_order[p] != root) p++; 
      int cnt = p-L1; // 左子树的结点个数
      lch[root] = buildtree(L1, p-1, L2, L2+cnt-1);
      rch[root] = buildtree(p+1, R1, L2+cnt, R2-1);
      return root ;
}

int best, best_sum; // 目前为止的最优解和对应的权和

void dfs(int u, int sum){//深度搜索 
    sum += u;
    if(!lch[u] && !rch[u]) { // 叶子
    if(sum < best_sum || (sum == best_sum && u < best)) 
        { best = u; best_sum = sum; }
      }
      if(lch[u]) dfs(lch[u], sum);
      if(rch[u]) dfs(rch[u], sum); 
}

int main(int argc, char *argv[])
{
    while(readlist(in_order)) {
        readlist(post_order);
        buildtree(0, i-1, 0, i-1);
        best_sum = 1000000000;
        dfs(post_order[i-1], 0);
        cout << best << "\n";
      }
    return 0;
}

 

 

树(Tree,UVA 548)

原文:https://www.cnblogs.com/secoding/p/9532540.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!