首先需要说明的是,网上不知道为什么很多误传,说给定前序、中序和后序中的两个,可以唯一确定另一个,显然这是错误的。给定前序和后序,是无法确定中序的,一个简单的例子就是只有两个节点的树,前序和后序给定,中序无法确定。
代码如下:
1 /* 2 * Copyright (c) 2014 3 * All Rights Reserved. 4 * author: laohaizi 5 */ 6 7 #include <iostream> 8 #include <string> 9 #include <string.h> 10 #include <stdio.h> 11 using namespace std; 12 13 typedef struct _NODE 14 { 15 char name; 16 struct _NODE *left,*right; 17 }NODE; 18 19 char *preorder="abcdefg"; 20 char *inorder="cbedagf"; 21 //char *inorder="abcdefg"; 22 char *postorder="cedbgfa"; 23 const int preorder_len = strlen(preorder); 24 const int inorder_len = strlen(inorder); 25 const int postorder_len = strlen(postorder); 26 27 NODE * PostOrder(char *preorder, int prebeg, int preend, char *inorder, int inbeg, int inend) 28 { 29 if (prebeg > preend || inbeg > inend || prebeg >= preorder_len || inbeg >= inorder_len || preend < 0 || inend < 0) 30 { 31 return NULL; 32 } 33 NODE *p = new NODE; 34 p->name = preorder[prebeg]; 35 int k = 0; 36 int cnt = 0; 37 for (k = inbeg; k <= inend; ++k) 38 { 39 cnt ++; 40 if (inorder[k] == preorder[prebeg]) 41 { 42 break; 43 } 44 } 45 p->left = PostOrder(preorder,prebeg+1,prebeg+cnt-1,inorder,inbeg,k-1); 46 p->right = PostOrder(preorder,prebeg+cnt,preend,inorder,k+1,inend); 47 return p; 48 } 49 50 NODE * PreOrder(char *postorder, int postbeg, int postend, char *inorder, int inbeg, int inend) 51 { 52 if (postbeg > postend || inbeg > inend || postbeg >= postorder_len || inbeg >= inorder_len || postend < 0 || inend < 0) 53 { 54 return NULL; 55 } 56 NODE *p = new NODE; 57 p->name = postorder[postend]; 58 int k = 0; 59 int cnt = 0; 60 for (k = inbeg; k <= inend; ++k) 61 { 62 cnt ++; 63 if (inorder[k] == postorder[postend]) 64 { 65 break; 66 } 67 } 68 p->left = PreOrder(postorder,postbeg,postbeg+cnt-2,inorder,inbeg,k-1); 69 p->right = PreOrder(postorder,postbeg+cnt-1,postend-1,inorder,k+1,inend); 70 return p; 71 } 72 73 int NodeNum(NODE *p) 74 { 75 if (p == NULL) 76 return 0; 77 return NodeNum(p->left)+NodeNum(p->right)+1; 78 } 79 80 void PostorderTraverse(NODE *p) 81 { 82 if(p != NULL) 83 { 84 PostorderTraverse(p->left); 85 PostorderTraverse(p->right); 86 cout<<p->name; 87 } 88 } 89 90 void PreorderTraverse(NODE *p) 91 { 92 if(p != NULL) 93 { 94 cout<<p->name; 95 PreorderTraverse(p->left); 96 PreorderTraverse(p->right); 97 } 98 } 99 100 int main() 101 { 102 //get postorder 103 NODE *root = PostOrder(preorder,0,preorder_len-1,inorder,0,inorder_len-1); 104 105 int nodenum = NodeNum(root); 106 if (nodenum != preorder_len) 107 { 108 cout<<"post order not exist."<<endl; 109 return 0; 110 } 111 112 cout<<"post order: "; 113 PostorderTraverse(root); 114 cout<<endl; 115 116 //get preorder 117 root = PreOrder(postorder,0,postorder_len-1,inorder,0,inorder_len-1); 118 119 nodenum = NodeNum(root); 120 if (nodenum != postorder_len) 121 { 122 cout<<"pre order not exist."<<endl; 123 //return 0; 124 } 125 126 cout<<"pre order: "; 127 PreorderTraverse(root); 128 cout<<endl; 129 return 0; 130 }