根据先序序列和中序序列求后序序列的循环实现

示例代码:(测试地址:http://codepad.org/9nz0yRRF

  1 #include<vector>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<stack>
  5 
  6 using namespace std ;
  7 
  8 /////////--------------------设计树的数据模型--------------------///////////
  9 /////////--- Start !!!!
 10 
 11 template< class T >
 12 class TreeSeq : public vector<T>
 13 {
 14 public :
 15    typedef T TreeNode ;
 16 
 17    TreeSeq( typename vector<T>::iterator beg, typename vector<T>::iterator end ) : vector<T>( beg, end ) { }
 18 
 19    template< class Iterator >
 20    TreeSeq( Iterator beg, Iterator end ) : vector<T>( beg, end ) { }
 21 
 22    TreeSeq(){}
 23 
 24    friend ostream& operator<<( ostream& out_stream, const TreeSeq& tree_seq )
 25    {
 26       for( unsigned index = 0; index != tree_seq.size(); index++ )
 27       {
 28          out_stream << tree_seq[index] << '\t' ;
 29       }
 30 
 31       return out_stream ;
 32    }
 33 } ;
 34 
 35 template< class T >
 36 const TreeSeq<T> operator+( const TreeSeq<T>& tree_obj, const TreeSeq<T>& tree_seq )
 37 {
 38    TreeSeq<T> temp( tree_obj );
 39 
 40    for ( typename vector<T>::const_iterator ite = tree_seq.begin();
 41          ite != tree_seq.end(); ite++ )
 42    { 
 43       temp.push_back( *ite );
 44    }
 45 
 46    return temp ;
 47 }
 48 
 49 template< class T >
 50 const TreeSeq<T> operator+( const TreeSeq<T>& tree_obj, const T& tree_node )
 51 {
 52    TreeSeq<T> temp( tree_obj );
 53 
 54    temp.push_back( tree_node );
 55 
 56    return temp ;
 57 }
 58 /////////--------------------设计树的数据模型--------------------///////////
 59 /////////--- End !!!!
 60 
 61 
 62 /////////--------------------设计簿记信息模型--------------------///////////
 63 /////////--- Start !!!!
 64 
 65 template< class TreeIte >
 66 struct TagInfo
 67 {
 68       TreeIte pre_beg, mid_beg ;
 69       unsigned size, total_len ;
 70 
 71       TagInfo( TreeIte& ite_pre_beg, TreeIte& ite_mid_beg,
 72                unsigned isize, unsigned len )
 73          : pre_beg( ite_pre_beg ), mid_beg( ite_mid_beg ),
 74            size( isize ), total_len( len ) { }
 75 } ;
 76 /////////--------------------设计簿记信息模型--------------------///////////
 77 /////////--- End !!!!
 78 
 79 
 80 /////////------------------根据先序中序求后序------------------///////////
 81 /////////--- Start !!!!
 82 
 83 template< class T >
 84 void getAftTraSeq( const TreeSeq<T>& preTraSeq, const TreeSeq<T>& midTraSeq, TreeSeq<T>& aftTraSeq )
 85 {
 86    typedef typename vector<T>::const_iterator TreeIte ;
 87    typedef TagInfo<TreeIte> TagInfo ;
 88 
 89    stack< TagInfo > stack_info ;
 90 
 91    TreeIte pre_beg = preTraSeq.begin() ;
 92    TreeIte pre_end = preTraSeq.end() ;
 93    TreeIte mid_beg = midTraSeq.begin() ;
 94    TreeIte mid_end = midTraSeq.end() ;
 95 
 96    while( pre_beg != pre_end && mid_beg != mid_end )
 97    {
 98       while( pre_beg != pre_end && mid_beg != mid_end )
 99       {
100          TreeIte tar_ite = find( mid_beg, mid_end, *pre_beg );
101 
102          unsigned dif_size = tar_ite - mid_beg ;
103 
104          if( dif_size )
105             stack_info.push(
106                TagInfo( pre_beg, mid_beg, dif_size, pre_end - pre_beg ) );
107 
108          aftTraSeq.insert( aftTraSeq.begin(), *pre_beg );
109 
110          cout << aftTraSeq << endl << endl ;
111 
112          pre_beg += 1 + dif_size ;
113          mid_beg += dif_size + 1 ;
114       }
115 
116       if( stack_info.empty( ) ) break ;
117       else
118       {
119          TagInfo& info_ref = stack_info.top( );
120 
121          unsigned dif_size = info_ref.total_len - info_ref.size - 1 ;
122 
123          pre_beg = info_ref.pre_beg + 1 ;
124          pre_end = pre_beg + dif_size ;
125          mid_beg = info_ref.mid_beg ;
126          mid_end = mid_beg + dif_size ;
127 
128          stack_info.pop( );
129       }
130    }
131 }
132 /////////------------------根据先序中序求后序------------------///////////
133 /////////--- End !!!!
134 
135 
136 /////////---------------------- 数 据 测 试 -------------------///////////
137 /////////--- Test !!!!
138 int main( int argc, char **argv )
139 {
140    char pre_seq_ary[8] = "ABDECFG" ;
141    char mid_seq_ary[8] = "DBEAFCG" ;
142 
143    TreeSeq<char> pre_seq( pre_seq_ary, pre_seq_ary + 7 ) ;
144    TreeSeq<char> mid_seq( mid_seq_ary, mid_seq_ary + 7 ) ;
145    TreeSeq<char> aft_seq ;
146 
147    cout << "已知先序遍历序列 : " << pre_seq << endl ;
148    cout << "已知中序遍历序列 : " << mid_seq << endl << endl ;
149    cout << "运算过程的数据变化情况如下 : " << endl ;
150 
151    getAftTraSeq( pre_seq, mid_seq, aft_seq );
152 
153    cout << "求得的后序遍历序列为 : " << aft_seq << endl ;
154 }

运行结果

 1 已知先序遍历序列 : A    B    D    E    C    F    G    
 2 已知中序遍历序列 : D    B    E    A    F    C    G    
 3 
 4 运算过程的数据变化情况如下 : 
 5 A    
 6 
 7 C    A    
 8 
 9 G    C    A    
10 
11 F    G    C    A    
12 
13 B    F    G    C    A    
14 
15 E    B    F    G    C    A    
16 
17 D    E    B    F    G    C    A    
18 
19 求得的后序遍历序列为 : D    E    B    F    G    C    A    

 

posted @ 2012-10-02 12:29  crazylhf  阅读(319)  评论(0编辑  收藏  举报