POJ 2255 Tree Recovery
已知二叉树的前序遍历序列和中序遍历序列,求后序遍历序列。
先递归构造二叉树,再递归后序遍历。
思路:
前序序列的第一个结点为要构造的二叉树的根节点,在中序序列中查找此节点,则其左为要构造的二叉树的左子树的中序序列,其右为要构造的二叉树的右子树的中序序列。而前序序列根节点后面分别跟着它的左子树和右子树的前序序列。有了根节点在中序序列中的位置,就知道了左子树和右子树的前序序列分别占据了前序序列中的那些位置,这样,就分别知道了两棵子树所代表的子序列。然后在构造了根结点后,就可以递归调用函数自身来分别构造根节点的左子树和右子树。
以上为二叉树的构造即恢复。
后序遍历二叉树也用递归。
1 #include <iostream> 2 #include<cstdio> 3 #include <string>//c++中的string类包含find,substr函数,或者用#include<algorithm> 4 using namespace std; 5 struct Node{ 6 char data; 7 Node* lchild; 8 Node* rchild; 9 }; 10 Node* CreateTree(string pre,string in)//递归创建二叉树 11 { 12 Node* root = NULL; 13 if(pre.length()>0) 14 { 15 root = new Node; 16 root->data = pre[0]; 17 int index = in.find(root->data); 18 root->lchild = CreateTree(pre.substr(1,index),in.substr(0,index));//从一个字符串复制一个从指定位置开始,并具有指定长度的子字符串 19 root->rchild = CreateTree(pre.substr(index+1),in.substr(index+1));//如果 length 为 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到字符串的结尾 20 } 21 return root; 22 } 23 24 void PostOrder(Node* root)//递归后序遍历 25 { 26 if(root!=NULL) 27 { 28 PostOrder(root->lchild); 29 PostOrder(root->rchild); 30 cout<<root->data; 31 } 32 } 33 34 int main() 35 { 36 string pre_str,in_str; 37 while (cin>>pre_str>>in_str) 38 { 39 Node* rt = CreateTree(pre_str,in_str); 40 PostOrder(rt); 41 cout<<endl; 42 } 43 }