由一棵二叉树的先序序列和中序序列可唯一确定这棵二叉树

思路:

(1)由先序可以得到树的根节点。

(2)由中序可以得到左右子树。

(3)重复(1)(2)即可恢复

同理给出后续和中序也可以按照上述思想唯一确定一棵树(这个程序转的http://www.cnblogs.com/microgrape/archive/2011/05/12/2043932.html

 1 #include <iostream>
 2 #include <map>
 3 #include <utility>
 4 #include <functional>
 5 #include <string>
 6 #include <stack>
 7 
 8 using namespace std;
 9 
10 typedef char Type;
11 
12 struct Node
13 {
14      Node( Node *t ) : data( t->data ), lChild( t->lChild ), rChild( t->rChild ) {}
15      Node( Type d ) : data( d ), lChild( NULL ), rChild( NULL ) {}
16 
17     struct Node* lChild;
18     struct Node* rChild;
19      Type data;
20 };
21 
22 Node *rebuildFromPreInOrder( string &preOrder, string &inOrder )
23 {
24     // preOrder and inOrder always have equal length.
25     if ( preOrder.size() == 0 )
26         return NULL;
27     if ( preOrder.size() == 1 ) 
28         return new Node( preOrder[0] );
29 
30     // get the root
31      Node *root = new Node( preOrder[0] );
32 
33     // divide inOrder sequence into two sub sequences 
34     // by the first node of preOrder sequence.
35      size_t rootPos = inOrder.find( preOrder[0] );
36     string left_sub_inorder = inOrder.substr( 0, rootPos );
37     string right_sub_inorder = inOrder.substr( rootPos + 1 );
38      size_t left_size = left_sub_inorder.size();
39     
40     // divide preOrder sequence into two sub sequences by their length.
41     string left_sub_preorder = preOrder.substr( 1, left_size );
42     string right_sub_preorder = preOrder.substr( left_size + 1 );
43 
44     // recursive rebuilding and connect with root
45      root->lChild = rebuildFromPreInOrder( left_sub_preorder, left_sub_inorder );
46      root->rChild = rebuildFromPreInOrder( right_sub_preorder, right_sub_inorder );
47     return root;
48 }
49 
50 void PostOrder( Node *root, void (*visit)(Node*) )
51 {
52      stack<Node*> s;
53      Node *cur = root;
54      Node *visited = NULL;
55 
56     while( ! s.empty() || cur != NULL )
57      {
58         while( cur != NULL )
59          {     s.push( cur ); cur = cur->lChild; }
60 
61          cur = s.top();  // check but no visit.
62 
63         if( cur->rChild == visited || cur->rChild == NULL )
64          {
65              visit( cur ); s.pop();
66              visited = cur;
67              cur = NULL; // no current node, must pop.
68          }
69         else
70              cur = cur->rChild;
71      }
72 }
73 
74 void visit( Node *t )
75 {
76      cout<<t->data;
77 }
78 
79 int main()
80 {
81     while ( !cin.eof() )
82      {
83         string pre, in;
84          cin>>pre>>in;
85          Node *root = rebuildFromPreInOrder( pre, in );
86          PostOrder( root, visit );
87          cout<<endl;
88      }
89     
90     return 0;
91 }

 

 

posted on 2012-05-23 17:15  为梦飞翔  阅读(4776)  评论(0编辑  收藏  举报

导航