洛谷 p1030 树的遍历

 

 

简单dfs

题目描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度\le 88)。

输入:

2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

输出:

1行,表示一棵二叉树的先序。

输入输出样例

输入 #1
BADC
BDCA
输出 #1
ABCD
从后序里找树的根节点(最后一个),前序中根据根节点把树分成左子树和右子树之后重复操作此过程
注意dfs的出口。
代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 string s1,s2;
 4 int len;
 5 void dfs(int l1,int r1,int l2,int r2){
 6     //printf("%d %d %d %d\n",l1,r1,l2,r2);
 7     if(l1>r1)
 8     return ;
 9     else
10     cout<<s2[r2];
11     for(int i=l1;i<=r1;i++){
12         if(s1[i]==s2[r2]){
13             dfs(l1, i-1, l2, l2+i-l1-1);
14             dfs(i+1, r1, i+l2-l1, r2-1);
15         }
16     }
17 }
18 int main(){
19     cin>>s1>>s2;
20     len=s1.size();
21     dfs(0,len-1,0,len-1);
22     return 0;
23 }

 

 

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int len;
void dfs(int l1,int r1,int l2,int r2)
{ //printf("%d %d %d %d\n",l1,r1,l2,r2); if(l1>r1) return ; else cout<<s2[r2]; for(int i=l1;i<=r1;i++)
{ if(s1[i]==s2[r2])
{ dfs(l1, i-1, l2, l2+i-l1-1); dfs(i+1, r1, i+l2-l1, r2-1); } } } int main(){ cin>>s1>>s2; len=s1.size(); dfs(0,len-1,0,len-1); return 0; }

 

posted on 2020-03-13 22:17  mmn  阅读(126)  评论(0编辑  收藏  举报