首页 > 代码库 > 华为机试(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; }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。