https://vpn.bupt.edu.cn/http/10.105.242.80/problem/p/109/
不难的一题,但写了贼久。。。
题设中序遍历步骤:
- 中序遍历(第
1
个子节点) - 访问根节点
- 中序遍历(第
2...N
子节点)
看起来很简单,但是遇到了以下坑。
- 必须要设置访问标记,否则直接访问父结点形成死循环
- 必须首先置根结点已访问
(A)
- 要对子节点向量进行排序
- 对于寻找第一棵左子树,必须要参照
(B)
进行循环,而不能简单的访问g[r][0]
- 对于寻找根结点的遍历中,每次使用中序遍历之前,要对vis进行初始化
(C)
写了半天连样例都过不了… …要引起重视了
AC代码
#include <bits/stdc++.h>
#define FF(a,b) for(int a=0;a<b;a++)
#define F(a,b) for(int a=1;a<=b;a++)
#define LEN 100
#define INF 1000000
#define bug(x) cout<<#x<<"="<<x<<endl;
using namespace std;
typedef long long ll;
const double pi=acos(-1);
vector<int> g[110];
int N;
string seq;
char s[110];
int vis[110];
int visit(int r