UVA548 - Tree

这个题目卡到我的地方

一是我对递归不熟,还没有建立二叉树和递归的关联。

二是,我把一个变量定义的太小了,(minn 的值定义得太小)。所以交了3遍的WA!!!

代码如下:

方法一:(把二叉树放到数组中)

#include <iostream>
#include <cstring>
using namespace std;
typedef struct
{
    int data, leftnode, rightnode;
} Node;
int inorder[10050], postorder[10050], minn, lastnode, x;
Node node[10050];
int Build(int inleft, int inright, int postleft, int postrigth, int &fa)
{
    int k, len;
    if(inleft > inright || postleft > postrigth)return 0;
    int p = fa = ++x;
    node[x].data = postorder[postrigth];
    for(k = inleft; k <= inright && inorder[k] != postorder[postrigth]; k++);
    len = k - inleft ;
    Build(inleft, k - 1, postleft, postleft + len - 1, node[p].leftnode);
    Build(k + 1, inright, postleft + len, postrigth - 1, node[p].rightnode);
    return 0;
}
int dfs(int i, int num)
{
    num += node[i].data;
    if(!node[i].leftnode && !node[i].rightnode)
    {
        if(num < minn)
        {
            minn = num;
            lastnode = node[i].data;

        }
        else if(num == minn)
        {
            if(lastnode > node[i].data)
                lastnode = node[i].data;
        }
        return 0;
    }
    if(node[i].leftnode) dfs(node[i].leftnode,num);
    if(node[i].rightnode)dfs(node[i].rightnode,num);
    return 0;
}
int main ()
{
    int d, inlength, postlength;
    while(1)
    {
        memset(node,0,sizeof(node));
        inlength = postlength = 0;
        while(1)
        {
            if((cin>>d) == 0)return 0;
            inorder[inlength++] = d;
            if(cin.get() == '\n')break;
        }
        while(1)
        {
            cin>>d;
            postorder[postlength++] = d;
            if(cin.get() == '\n')break;
        }
        //if(inlength != postlength)cout<<"error!!!"<<endl;
        Build(0, inlength-1, 0, postlength-1, node[x = 0].rightnode);
        lastnode = minn = 99999;
        dfs(1, 0);
        cout<<lastnode<<endl;
    }
    return 0;

}

方法二:(建立真正的二叉树)

#include <iostream>
#include <cstdlib>
using namespace std;
int inorder[10010], postorder[10010], minn, lastnode;
typedef struct Temp{
    int data;
    Temp *leftnode, *rightnode;
}Node;
int Buildtree(int inleft, int inright, int postleft, int postright, Node* &head)
{
    int k, length;
    if(inleft > inright || postleft > postright){head = NULL;return 0;}
    head = (Node*)malloc(sizeof(Node));
    head->data = postorder[postright];
    //cout<<"build"<<" "<<head->data<<endl;
    for(k = inleft; k <= inright && inorder[k] != postorder[postright];k++);
    length = k - inleft;
    Buildtree(inleft, k-1, postleft, postleft+length-1,head->leftnode);
    Buildtree(k+1, inright, postleft+length, postright-1, head->rightnode);
    return 0;
}
int dfs(Node* head, int sum)
{
    sum+=head->data;//cout<<head->data<<" -> "<<sum<<endl;
    if(!head->leftnode && !head->rightnode)
    {
        if(sum<minn){minn = sum;lastnode = head->data;}
        else if(minn == sum && lastnode > head->data)
        lastnode = head->data;
        return 0;
    }
    if(head->leftnode)dfs(head->leftnode,sum);
    if(head->rightnode)dfs(head->rightnode,sum);
    return 0;
}
int main ()
{
    int d, inlength, postlength;
    while(1){
        inlength = postlength = 0;
        while(1){
            if((cin>>d) == 0)return 0;
            inorder[inlength++] = d;
            if(cin.get() == '\n')break;
        }
        while(1){
            cin>>d;
            postorder[postlength++] = d;
            if(cin.get() == '\n')break;
        }
        Node *head; //= (Node *)malloc(sizeof(Node));
        Buildtree(0, inlength-1, 0, postlength-1, head);//cout<<"*****"<<endl;
        minn = lastnode = 999999;
        dfs(head, 0);
        cout<<lastnode<<endl;
    }
    return 0;
}


posted on 2012-10-27 17:32  Primo...  阅读(149)  评论(0编辑  收藏  举报