根据先序序列和中序序列求后序序列的循环实现
示例代码:(测试地址: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