二叉树的遍历1
Description
小Valentine非常喜欢玩二叉树,她喜欢的游戏是随意构造一颗二叉树,用大写字母编号标识结点。下图是她构造的二叉树中的一棵:
D
/ \
B E
/ \ \
A C G
/
F
为了向她的后代记录她所创建的树,她给每棵树写下两串字符串,表示先序遍历(根,左子树,右子树)和中序遍历(左子树,根,右子树)的结果。
对于上面的树,先序遍历的结果是DBACEGF,中序遍历的结果是ABCDEFG。
她认为这样的一对字符串给出了重构这棵树的足够的信息(但她从来没有尝试去重构二叉树)。
过了好些年,她认识到重构这些树的确是可能的。对于同一棵树,同一个字母不会用两次。
然而,如果手工完成重构二叉树,那是非常乏味的。因此,请您编写一个程序来为她完成这一项工作。
Input
输入包含一个或多个测试用例。每个测试用例一行,给出两个字符串,表示对二叉树进行先序遍历和中序遍历的结果。这两个字符串都是由大写字母组成(因此它们的长度不超过26)。
Output
将每个测试用例转化为Valentine的二叉树,并在一行中输出树的后序遍历(左子树,右子树,根)的结果。
DBACEGF ABCDEFG
BCAD CBAD
-
Sample Input
ACBFGED
CDAB
-
Sample Output
-
#include<bits/stdc++.h> using namespace std; string a, b; void tree(string c,string d){ if( c.size() <= 0 ) { return ; } int p = d.find(c[0]); tree(c.substr( 1, p ),d.substr( 0, p ) ); tree(c.substr( p + 1 ),d.substr( p + 1 )); cout << c[0]; } int main(){ while(cin>>a>>b){ tree(a,b); cout<<endl; } return 0; }
二叉树的遍历2
-
小Valentine非常喜欢玩二叉树,她喜欢的游戏是随意构造一颗二叉树,用大写字母编号标识结点。下图是她构造的二叉树中的一棵:
D
/ \
B E
/ \ \
A C G
/
F
为了向她的后代记录她所创建的树,她给每棵树写下两串字符串,表示后序遍历(左子树,右子树,根)和中序遍历(左子树,根,右子树)的结果。
对于上面的树,后序遍历的结果是ACBFGED,中序遍历的结果是ABCDEFG。
她认为这样的一对字符串给出了重构这棵树的足够的信息(但她从来没有尝试去重构二叉树)。
过了好些年,她认识到重构这些树的确是可能的。对于同一棵树,同一个字母不会用两次。
然而,如果手工完成重构二叉树,那是非常乏味的。因此,请您编写一个程序来为她完成这一项工作。
-
Input
输入包含一个或多个测试用例。每个测试用例一行,给出两个字符串,表示对二叉树进行后序遍历和中序遍历的结果。这两个字符串都是由大写字母组成(因此它们的长度不超过26)。
Output
将每个测试用例转化为Valentine的二叉树,并在一行中输出树的先序遍历(根,左子树,右子树)的结果。
-
Sample Input
- ACBFGED ABCDEFG CDAB CBAD
-
Sample Output
DBACEGF BCAD -
#include<bits/stdc++.h> using namespace std; string a,b; void dp(string a,string b){ int z=a.size(); if(a.size()<=0){ return ; } int t=b.find(a[z-1]); cout<<a[z-1]; dp(a.substr(0,t),b.substr(0,t)); dp(a.substr(t,z-t-1),b.substr(t+1)); } int main(){ while(cin>>a>>b){ dp(a,b); cout<<endl; } }