UVa 548 - Tree

在写这篇文章之前, 我只想说, 坑坑啊

从昨天早上开始写这题. 不会写, 很正常. 于是就去找了一个解题报告. 为了以防万一, 我还提交了一下. 嗯, 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);
}






1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值