• UVa 548 -- Tree


    UVa 548 - Tree

    给你一棵树的中根序和后根序遍历,求从根到叶子组成的路径中数字和最小的那条。

    分析:DFS,树,递归。直接递归求解,用全局变量更新即可。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<sstream>
     4 #include<cstring>
     5 using namespace std;
     6 const int maxn = 10000 + 5;
     7 int in_list[maxn];///中序序列
     8 int post_list[maxn];///后序序列
     9 int ans;
    10 int ans_node;
    11 int list_len;
    12 ///按行读取输入结点序列
    13 bool read_list(int *a)
    14 {
    15     string line;
    16     if(!getline(cin,line)) return false;
    17     stringstream ss(line);
    18     int n=0;
    19     int x;
    20     while(ss >> x) a[n++] = x;
    21     list_len = n;
    22     return n > 0;
    23 }
    24 
    25 void bfs(int *in,int *post,int n,int sum)
    26 {
    27     if(n <= 0) return;
    28     if(n == 1)///到达叶子节点
    29     {
    30         ///更新解
    31         if(ans > sum+post[n-1])
    32         {
    33             ans = sum+post[n-1];ans_node = post[n-1];
    34         }
    35         ///相等的情况
    36         else if(ans == sum+post[n-1] && post[n-1]<ans_node)
    37         {
    38             ans = sum+post[n-1];ans_node = post[n-1];
    39         }
    40         return;
    41     }
    42     int root = post[n-1];
    43     int p = 0;
    44     while(in[p] != root) p++;
    45     //进入子树之前sum加上当前根节点的值
    46     sum += root;
    47     bfs(in,post,p,sum);///左子树
    48     bfs(in+p+1,post+p,n-p-1,sum);///右子树
    49 }
    50 
    51 int main()
    52 {
    53     while(read_list(in_list))
    54     {
    55         read_list(post_list);
    56         ans = 100000005;ans_node = 20000;
    57         bfs(in_list,post_list,list_len,0);
    58         cout<<ans_node<<endl;
    59     }
    60     return 0;
    61 }

  • 相关阅读:
    自动生成四则运算题目
    学习进度总结随笔
    作业1
    软件工程项目总结
    结对编程项目---四则运算
    作业三
    自动生成小学四则运算题目的程序
    学习进度总结
    大三下自我简介
    寒假社会实*报告
  • 原文地址:https://www.cnblogs.com/yxh-amysear/p/8449294.html
Copyright © 2020-2023  润新知