首页 > 代码库 > 华为机试(A)

华为机试(A)

 

二叉树遍历       答题时间: 00 小时 03 分 11 秒
描述: 

二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。

 
题目类别: 树 
难度: 中级 
运行时间限制:无限制
内存限制:无限制
  
输入: 

两个字符串,其长度n均小于等于26。 第一行为前序遍历,第二行为中序遍历。 二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。

 
输出: 

输入样例可能有多组,对于每组测试样例, 输出一行,为后序遍历的字符串。

 
样例输入:
ABCBACFDXEAGXDEFAG
#include <iostream>#include<string>using namespace std;struct BiTree{  char val;  BiTree *left;  BiTree *right;  BiTree(char a):val(a),left(NULL),right(NULL){}};BiTree *creatBiTree(string A,string B){    BiTree *root;  if(A!="")    root= new BiTree(A[0]);  else  {      root= NULL;      return root;   }  if(A==B && A.size()==1)      return root;  unsigned i;  unsigned len = B.size();  for( i=0;i<len;i++)  {    if(A[0]==B[i])        break;    }  unsigned leftlen = i;  unsigned rightlen = len-1-leftlen;  string Aleft = A.substr(1,leftlen);  string Aright = A.substr(leftlen+1,rightlen);  string Bleft = B.substr(0,leftlen);  string Bright = B.substr(leftlen+1,rightlen);  root->left = creatBiTree(Aleft,Bleft);  root->right = creatBiTree(Aright,Bright);  return root;}void PostTree(BiTree *root){  if(root!=NULL)  {    PostTree(root->left);    PostTree(root->right);    cout<<root->val;  }}int main(){  string A,B;  while(cin>>A>>B)  {     BiTree *root = creatBiTree(A,B);     PostTree(root);     cout<<endl;  }}