码迷,mamicode.com
首页 > 其他好文 > 详细

华为机试(A)

时间:2014-07-02 17:40:45      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   width   os   for   

 

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

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

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

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

 
输出:  

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

 
样例输入:
ABC
BAC
FDXEAG
XDEFAG
#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;
  }
}

 

 

 

 

华为机试(A),布布扣,bubuko.com

华为机试(A)

标签:style   blog   color   width   os   for   

原文地址:http://www.cnblogs.com/Xylophone/p/3819851.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!