二叉树遍历 | 答题时间: 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; } }
时间: 2024-10-28 15:43:38