题意是给出先序和中序,求出后序。
先序遍历先访问根结点,通过根结点可以在中序中把序列分为左子树部分和右子树部分,我建了一个栈,因为后序遍历最后访问根结点,所以把每次访问的根结点放入栈中。因为后序遍历先是左子树然后是右子树,所以在递归的时候就先递归右子树,然后继续递归左子树。
写完程序后有个错误,找了很久才发现,就是我原本在计算左子树个数的时候,是这样计算的,pre2=mid-pre,但是当pre>mid时,就不对了。而正确计算左子树的方法应该是下面这样的。
1 #include<iostream> 2 #include<cstring> 3 #include<stack> 4 using namespace std; 5 6 char t1[30], t2[30]; 7 stack<char>map; 8 int length; 9 10 void solve(int pre, int mid, int len) 11 { 12 map.push(t1[pre]); 13 int i = mid; 14 while (t2[mid] != t1[pre]) mid++; //在中序序列中找到与前序序列相同的结点 15 int pre2 = mid - i; //左子树的数量 16 int mid2 = len - 1 - pre2; //右子树的数量 17 if (mid2 >= 1) 18 solve(pre + pre2 + 1, mid + 1, mid2); 19 if (pre2 >= 1) 20 solve(pre + 1, mid - pre2, pre2); 21 } 22 23 24 int main() 25 { 26 while (cin >> t1 >> t2) 27 { 28 length = strlen(t1); 29 solve(0, 0, length); 30 while (!map.empty()) 31 { 32 char s = map.top(); 33 cout << s; 34 map.pop(); 35 } 36 cout << endl; 37 } 38 return 0; 39 }
后来数据结构实验的时候也要写这么的一个算法,主要部分就是
1 bintree buildBintree(char *pre, char *mid,int length) 2 { 3 int lch,rch; 4 bintree root; 5 root=(bintree)malloc(sizeof(binnode)); 6 lch=0; 7 root->data=*pre; 8 while(*mid!=*pre) {mid++;lch++;} 9 rch=length-1-lch; 10 if(rch>=1) root->rchild=buildBintree(pre+lch+1,mid+1,rch); 11 else root->rchild=NULL; 12 if(lch>=1) root->lchild=buildBintree(pre+1,mid-lch,lch); 13 else root->lchild=NULL; 14 return root; 15 }
一开始没加11和13语句,然后就不对,看来这个指针问题得好好注意一下。