洛谷-UVA536 二叉树重建 Tree Recovery

女爷i 2023-06-18 14:55 106阅读 0赞

题目描述

PDF

format_png

输入格式

format_png 1

输出格式

format_png 2

题意翻译

输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列。

输入输出样例

输入 #1复制

  1. DBACEGF ABCDEFG
  2. BCAD CBAD

输出 #1复制

  1. ACBFGED
  2. CDAB

方法一:超时了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string preorder;
  4. string inorder;
  5. void proorder(string pre,string in){
  6. //结束条件
  7. if(in.size()==0){//或者条件为pre.size()==0
  8. return;
  9. }
  10. int len=in.find(pre[0]);
  11. proorder(pre.substr(1,len),in.substr(0,len));
  12. proorder(pre.substr(len+1),in.substr(len+1));
  13. cout<<pre[0];//没有左子树、也没有右子树了
  14. }
  15. int main(){
  16. while(true){
  17. cin>>preorder>>inorder;
  18. proorder(preorder,inorder);
  19. cout<<endl;
  20. }
  21. return 0;
  22. }

方法二:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string preorder,inorder;
  4. void postorder(int l1,int l2,int n){
  5. if(n<=0){
  6. return;
  7. }
  8. int len=inorder.find(preorder[l1])-l2;
  9. postorder(l1+1,l2,len);
  10. postorder(l1+len+1,l2+len+1,n-len-1);
  11. cout<<preorder[l1];
  12. }
  13. int main(){
  14. while(cin>>preorder>>inorder){
  15. int len=preorder.size();
  16. //第一个参数为:先序开始下标
  17. //第二个参数为:后续开始下标
  18. //len为节点数
  19. postorder(0,0,len);
  20. cout<<endl;
  21. }
  22. return 0;
  23. }

发表评论

表情:
评论列表 (有 0 条评论,106人围观)

还没有评论,来说两句吧...

相关阅读

    相关 S-Trees UVA712(

    题目读了半天,差点被吓住!题目本身很简单,就是一颗满二叉树,向左(2\temp),向右(2\temp+1),最后减去(1<<n)-1;(即非叶子结点的个数,因为储存叶子结点是从