USACO 3.4 American Heritage

USACO 3.4 American Heritage

给出一个树的中序遍历和先序遍历,求它的后序遍历。

递归求解即可。
先序遍历中的第一个值必为中间结点的值,然后在中序遍历中找到这个值。这个值左边的为左子树的中序遍历,右边为右子树的中序遍历。
先序遍历中,前半部分为左子树的先序遍历,其长度和中序子左子树的长度相同。因此两个子树的中序和先序遍历都可以确定了。

构造出完整的树之后,再后序遍历即可。


#include  < iostream >
#include 
< fstream >

using   namespace  std;

ifstream fin(
" heritage.in " );
ofstream fout(
" heritage.out " );

#ifdef _DEBUG
#define  out cout
#define  in cin
#else
#define  out fout
#define  in fin
#endif

char  in_order[ 27 ];
char  pre_order[ 27 ];

struct  tree_node{
    
char  value;
    tree_node
* left, * right;
    tree_node(){
        left 
=  right  =  NULL;
    }
};

tree_node
*   build_tree( int  in_start, int  in_end, int  pre_start, int  pre_end)
{
    tree_node 
* node  =   new  tree_node;

    node
-> value  =   pre_order[pre_start];

    
if (pre_start > pre_end)  return  NULL;

    
if (pre_start != pre_end){
        
int  pos;
        
for (pos = in_start;pos <= in_end; ++ pos){
            
if (in_order[pos] == pre_order[pre_start])
                
break ;
        }
        node
-> left  =  build_tree(in_start,pos - 1 ,pre_start + 1 ,pre_start + pos - in_start);
        node
-> right  =  build_tree(pos + 1 ,in_end,pre_start + pos - in_start + 1 ,pre_end);
    }

    
return  node;
}

void  post_traverse( const  tree_node * node)
{
    
if (node == NULL)  return ;

    
if (node -> left != NULL){
        post_traverse(node
-> left);
    }

    
if (node -> right != NULL){
        post_traverse(node
-> right);
    }

    
out << node -> value;
}


void  solve()
{
    
in >> in_order;
    
in >> pre_order;

    post_traverse( build_tree(
0 ,strlen(in_order) - 1 , 0 ,strlen(pre_order) - 1 ) );

    
out << endl;
}


int  main( int  argc, char   * argv[])
{
    solve(); 
    
return   0 ;
}



其实不需要建树,再后序遍历。直接在建树过程中后序输出即可。

#include  < iostream >
#include 
< fstream >

using   namespace  std;

ifstream fin(
" heritage.in " );
ofstream fout(
" heritage.out " );

#ifdef _DEBUG
#define  out cout
#define  in cin
#else
#define  out fout
#define  in fin
#endif

char  in_order[ 27 ];
char  pre_order[ 27 ];
char  post_order[ 27 ];

struct  tree_node{
    
char  value;
    tree_node
* left, * right;
    tree_node(){
        left 
=  right  =  NULL;
    }
};

void   build_tree( int  in_start, int  in_end, int  pre_start, int  pre_end)
{
    
if (pre_start > pre_end)  return ;

    
if (pre_start != pre_end){
        
int  pos;
        
for (pos = in_start;pos <= in_end; ++ pos){
            
if (in_order[pos] == pre_order[pre_start])
                
break ;
        }
        build_tree(in_start,pos
- 1 ,pre_start + 1 ,pre_start + pos - in_start);
        build_tree(pos
+ 1 ,in_end,pre_start + pos - in_start + 1 ,pre_end);
    }

    
out << pre_order[pre_start];
}

void  solve()
{
    
in >> in_order;
    
in >> pre_order;

    build_tree(
0 ,strlen(in_order) - 1 , 0 ,strlen(pre_order) - 1 );

    
out << endl;
}


int  main( int  argc, char   * argv[])
{
    solve(); 
    
return   0 ;
}


你可能感兴趣的:(USACO 3.4 American Heritage)