UVA548
来源:互联网 发布:碳酸钙 柠檬酸钙 知乎 编辑:程序博客网 时间:2024/05/29 08:17
这道题目意思就是给你一棵树的中序和后序,然后根据这两个来建棵数,并求出数字和最小的那条路径的叶子是什么。
首先第一步肯定是要建树,是个标准建树。然后用dfs遍历并,遍历时要把父节点的值一路叠加下来,碰到叶子节点后,比较哪个最小,把节点的值保存下。。
AC代码:
#include<iostream>#include<string>#include<stdio.h>#include<stdlib.h>#include<string.h>using namespace std;struct node {int val;int sum;node* left;node* right;};node* newnode() {node* u = (node*)malloc(sizeof(node));u -> left = u -> right = NULL;return u;}node* creatnode(int* mid,int* post,int n) {if (n == 0)return NULL;int i = n - 1;for (;post[n - 1] != mid[i];i--);node* u =newnode();u -> val = post[n - 1];u -> sum = post[n - 1];u -> left = creatnode(mid ,post ,i);u -> right = creatnode(mid + i + 1 ,post + i,n - i -1 );return u;}int m = 1000;int res;int makesum(node* u , int sum) {if (u -> left == NULL && u -> right == NULL) {u -> sum = u -> sum +sum;if (u -> sum < m) {m = u -> sum;res = u -> val;}return 0;}u -> sum = u -> sum + sum;if (u -> right != NULL && u -> left != NULL) {makesum(u -> left ,u -> sum);makesum(u -> right , u -> sum);return 0;}if (u -> left != NULL) {makesum(u -> left ,u -> sum);return 0;}if (u -> right != NULL) {makesum(u -> right , u -> sum);return 0;}}int main () {char ch;int mid[10000];int post[10000];int i = 0;int num;while (scanf("%d",&num) != EOF) {mid[i++] = num;ch = getchar();if (ch == '\n') {for (int j = 0 ;j < i;j++)scanf("%d",&post[j]);node* u = creatnode(mid,post,i);makesum(u ,u -> sum);cout << res << endl;m = 1000;i = 0;}}return 0 ;}
0 0
- UVA548
- UVA548
- uva548
- uva548
- Uva548
- UVA548
- UVA548
- UVA548
- UVA548
- uva548 Tree
- UVA548 - Tree
- UVA548- Tree
- Tree UVA548
- uva548 - Tree
- tree uva548
- uva548 Tree
- uva548 -- Tree
- uva548(树)
- 单例模式
- psp开发------按键识别
- vim 自动补全和自动提示
- Linux系统编程(5)——文件与IO之mmap函数
- 链表系列之单链表常见面试题
- UVA548
- 用Toad for Oracle将数据库表等信息导出为html
- 【原创】《Linux设备驱动程序》学习之循序渐进 --- 内核数据类型
- 自旋锁的讨论
- Uva 11044 Searching for Nessy
- bool判断回文数2
- Centos6.5内核编译(3.14.13)
- Java容器类Collection、List、ArrayList、Vector及map、HashTable、HashMap区别
- MessageFormat用法