废话不说,先贴代码。
总结一下:
1::链表什么的,left,rigit,不是想当然它就那么自然的连接下面的。 要自己申请空间给root->left,root->right
2::求和放在dfs里面
3::以后若是有比赛的环境,ANSI C可能不允许用//,得注意点...
4::还有看清题目要求开数组
1 #include<cstdio>
2 #include<string>
3 #include<vector>
4 #define maxn 10010//得比10000大
5 using namespace std;
6 vector<int>ans;
7 int innode[maxn];int postnode[maxn];
8 typedef struct Node
9 {
10 struct Node *left;
11 struct Node *right;
12 int data;
13 }node;
14 int nodeIndex;
15 node cc[maxn];
16 node * newnode()
17 {
18 /*node *u=new node;
19 u->left=NULL;
20 u->right=NULL;
21 return u;*/
22 cc[nodeIndex].left = NULL;
23 cc[nodeIndex].right = NULL;
24 return &cc[nodeIndex++];
25 }
26 node* buildtree(int innode[],int postnode[],int len)
27 {
28 if(len==0) return NULL;
29 int i=len-1;
30 while(postnode[len-1]!=innode[i])
31 --i;
32 node *h=newnode();//这地方往下都是自己没写出来的 //这里应该得自己申请一个空间吧
33 h->data=postnode[len-1];
34 h->left=buildtree(innode,postnode,i);
35 h->right=buildtree(innode+i+1,postnode+i,len-i-1);
36 return h;
37 }
38 void dfs(node *root,int n)//结点求和加在dfs里面了...
39 {
40 if(root->left==NULL&&root->right==NULL)
41 {
42 ans.push_back(n+root->data);return;//这地方得有return 不然这个递归就没有结束条件了
43 }
44 while(root->left!=NULL) dfs(root->left,n+root->data);
45 while(root->right!=NULL) dfs(root->right,n+root->data);
46 }
47 int main()
48 {
49 freopen("input.txt","r",stdin);
50 //freopen("output.txt","w",stdout);
51 while(scanf("%d",&innode[0])!=EOF)//这个地方输入挺特别的 先读取第一位 然后由中序遍历的长度读取后序遍历
52 {
53 ans.clear();//每次ans得清零
54 int t=1;
55 while(getchar()!='\n')//这个地方的处理也值得自己学习 当输入不是回车时才读入整数....
56 scanf("%d",&innode[t++]);//这样可以根据t来处理后序遍历 也不用保存字符了....赞
57 for(int i=0;i<t;i++)
58 scanf("%d",&postnode[i]);
59 node *root=buildtree(innode,postnode,t);
60 dfs(root,0);//把求和这一步要加在dfs里面比较好吧
61 int temp=ans[0];
62 for(int j=0;j<ans.size();j++)
63 if(temp>ans[j]) temp=ans[j];
64 printf("%d\n",temp);
65 }
66 return 0;
67 }