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
原创粉丝点击