在写这篇文章之前, 我只想说, 坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑啊
从昨天早上开始写这题. 不会写, 很正常. 于是就去找了一个解题报告. 为了以防万一, 我还提交了一下. 嗯, AC.
然后我就边写边理解.
到了昨天中午, 完工了, 提交, OK, AC.
但是我又从头看了一遍程序, 发现这程序不符合题目的要求. 题目要求如果有多个相同的路径值时, 输出最小的叶子值, 可是它仅仅输出按顺序最小的叶子.
所!以!说!题!目!的!测!试!数!据!有!问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!里面根本没有多个相同的路径的数据(╯‵□′)╯ ┴─┴
本来这也没问题, 只要遍历一遍相同的结果, 就可以得出来, 然后不知道怎么的我就花样作死了, 怎么也得不出结果, 到最后输出先序遍历也错了, 说明树建错了. 我就以为原来的程序建树有问题......就这样折腾了一天
刚才又去看了一下原来的样板, 建树没问题...真是...
就当自己花一天时间学习两种建树的方法吧...
下面两种代码都正确, 供参考. 其他都一样, 就是由后序遍历和中序遍历建树的方法不一样.
代码I
#include <cstdlib>
#include <vector>
#include <cstdio>
using namespace std;
struct Node
{
int value;
Node *left, *right;
Node()
{
left = NULL;
right = NULL;
}
};
const int MAXN = 10005;
int inOrder[MAXN], postOrder[MAXN], len;
vector<int> result;
vector<Node *> pResult;
void DFS(Node *node, int sum);
void Input();
Node *InPostBuildTree(int inStart, int inLen, int postStart, int postLen);
int main()
{
int least;
//freopen("input.txt", "r", stdin);
while (~scanf("%d", &inOrder[0]))
{
Input();
Node *root = InPostBuildTree(0, len - 1, 0, len - 1);
result.clear();
pResult.clear();
DFS(root, 0);
int minPos = 0;
for (int i = 0; i < result.size(); i++)
if (result[i] < result[minPos])
minPos = i;
least = pResult[minPos]->value;
for (int i = 0; i < result.size(); i++)
{
if (result[i] == result[minPos] && pResult[i]->value < least)
least = pResult[i]->value;
}
printf("%d\n", least);
}
return 0;
}
void Input()
{
int i, j;
len = 1;
while (getchar() != '\n')
scanf("%d", &inOrder[len++]);
for (i = 0; i < len; i++)
scanf("%d", &postOrder[i]);
}
Node * InPostBuildTree(int inStart , int inLen , int postStart , int postLen )
{
//这里的inLen, postLen实际上是长度减一, 但是如果把它改成真正的长度我不会..
if( postStart <= postLen )
{
Node * root = new Node();
root->value = postOrder[postLen];
int pos = 0 ;
for( int i = inStart ; i <= inLen ; i++ )
if( inOrder[i] == postOrder[postLen] )
{ pos = i ; break ; }
//递归构造左子树,pos-inLen-1为左子树在数组的长度.....
root ->left = InPostBuildTree( inStart , pos - 1 , postStart , postStart + pos - inStart - 1 ) ;
root ->right = InPostBuildTree( pos + 1 , inLen , postStart + pos - inStart , postLen - 1 ) ;
return root ;
}
else
return NULL ;
}
void DFS(Node *node, int sum)
{
if (!node->left && !node->right)
{
result.push_back(sum + node->value);
pResult.push_back(node);
}
if (node ->left)
DFS(node->left, sum + node->value);
if (node->right)
DFS(node->right, sum + node->value);
}
代码2
#include <cstdlib>
#include <vector>
#include <cstdio>
using namespace std;
struct Node
{
int value;
Node *left, *right;
Node()
{
left = NULL;
right = NULL;
}
};
const int MAXN = 10005;
int inOrder[MAXN], postOrder[MAXN], len;
vector<int> result;
vector<Node *> pResult;
void DFS(Node *node, int sum);
void Input();
Node *InPostBuildTree(int *in, int *post, int len);
int main()
{
int least;
//freopen("input.txt", "r", stdin);
while (~scanf("%d", &inOrder[0]))
{
Input();
Node *root = InPostBuildTree(inOrder, postOrder, len);
result.clear();
pResult.clear();
DFS(root, 0);
int minPos = 0;
for (int i = 0; i < result.size(); i++)
if (result[i] < result[minPos])
minPos = i;
least = pResult[minPos]->value;
for (int i = 0; i < result.size(); i++)
{
if (result[i] == result[minPos] && pResult[i]->value < least)
least = pResult[i]->value;
}
printf("%d\n", least);
}
return 0;
}
void Input()
{
int i, j;
len = 1;
while (getchar() != '\n')
scanf("%d", &inOrder[len++]);
for (i = 0; i < len; i++)
scanf("%d", &postOrder[i]);
}
Node * InPostBuildTree(int *in, int *post, int len)
{
if (len == 0)
return NULL;
Node *root = new Node();
root->value = post[len - 1];
int i = 0;
while (in[i] != post[len - 1])
i++;
root->left = InPostBuildTree(in, post, i);
root->right = InPostBuildTree(in + i + 1, post + i, len - i - 1);
return root;
}
void DFS(Node *node, int sum)
{
if (!node->left && !node->right)
{
result.push_back(sum + node->value);
pResult.push_back(node);
}
if (node ->left)
DFS(node->left, sum + node->value);
if (node->right)
DFS(node->right, sum + node->value);
}