UVA 548 RE

来源:互联网 发布:java解决高并发 编辑:程序博客网 时间:2024/06/05 20:49

中序和后序建树,求出最短路径叶子结点并打印之

坑爹的UVA 总是RE,估计是栈不够用了,难道要手工做。。。

#include <iostream>#include <vector>#include <cstdio>#include <cstdlib>#include <cmath>#include <algorithm>#include <cstring>#include <stack>#include <memory>using namespace std;////#define MAXNUM 9999999int pre[10010];int ino[10010];char input[10010];int findnum(int num){int i;for (i = 0; ino[i] != 0; i++){if (ino[i] == num)return i;}return 0;}struct result{int value;int minpos;};result minLeave(int preL, int preR, int inoL, int inoR){int i, j;result ans;//叶子结点if (preL == preR || inoL == inoR){ans.value = pre[preL];ans.minpos = preL;return ans;}int num = pre[preL];int inumpos = findnum(num);result left, Right;if (preL + 1 <= preL + inumpos - inoL){left = minLeave(preL + 1, preL + inumpos - inoL, inoL, inumpos - 1);}else{left.value = MAXNUM;}if (preL + inumpos - inoL + 1 <= preR){Right = minLeave(preL + inumpos - inoL + 1, preR, inumpos + 1, inoR);}elseRight.value = MAXNUM;if (Right.value > left.value){ans.value = left.value + num;ans.minpos = left.minpos;return ans;}else{ans.value = Right.value + num;ans.minpos = Right.minpos;return ans;}}int main(){freopen("F:\\input.txt","r",stdin );///int i, j;int len;while (1){//读取前序和中序输入序列memset(pre, 0, sizeof(pre));memset(ino, 0, sizeof(ino));//Leavenum = 0;if (gets(input) == NULL)break;len = strlen(input);j = 0;for (i = 0; i < len; i++){while (input[i] == ' ' && i < len)i++;pre[j] = 0;while(input[i] && isdigit(input[i]))        {           pre[j] = pre[j] * 10 + input[i] - '0';           i++;        }        j++;        if(!input[i]) break;}gets(input);len = strlen(input);j = 0;for (i = 0; i < len; i++){while (input[i] == ' ' && i < len)i++;ino[j] = 0;while(input[i] && isdigit(input[i]))        {           ino[j] = ino[j] * 10 + input[i] - '0';           i++;        }        j++;        if(!input[i]) break;}//数据分析和计算result minl = minLeave(0, j - 1, 0, j - 1);printf("%d\n", pre[minl.minpos]);}///return 0;}


 

原创粉丝点击