小埋的二叉树 全WA求调

(完全是送解决方案好吧)
题目描述
小埋一直被安吉冷落。通过一个共同的朋友,他发现安吉非常喜欢二叉树,于是决定解决她的问题,以引起她的注意。

​ 安吉给了小埋一棵有 n 个顶点的二叉树。顶点 1 是根,没有父顶点。所有其他顶点都有一个父顶点。每个顶点最多可以有 2 个子顶点、一个左子顶点和一个右子顶点。对于每个顶点,安吉都会告诉小埋它的左子和右子的索引,或者告诉他它们不存在。此外,每个顶点上都有一个字母 s_i ,即 “U”、"L "或 “R”。

小埋从根开始下棋,他的每一步都是这样走的:

如果当前顶点上的字母是 “U”,他就移动到它的父顶点。如果它不存在,他就什么也不做。
如果当前顶点上的字母是 “L”,则移动到其左侧子顶点。如果它不存在,则他什么也不做。
如果当前顶点上的字母是 “R”,则移动到其右边的子顶点。如果它不存在,则他什么也不做。
在移动之前,他可以执行以下操作:选择任意一个节点,并用另一个节点替换写在上面的字母。

我们想知道的是,当他开始旅行时,他将在某一点到达一片叶子,那么他在旅行前需要做的操作的最小数目。叶子是一个没有子顶点的顶点。他到达哪片叶子并不重要。需要注意的是,他是否会停留在叶子上并不重要,他只需要移动到叶子上。此外,他需要移动多少次才能到达一片叶子也无关紧要。

帮助小埋解开安吉的树,这样他就能赢得她的芳心。

输入格式
第一行输入一个整数 t(1 \le t \le 5 \times 10^4) ,代表测试的样例数量。

对于每组测试样例的输入的第一行是一个整数 n(2 \le n \le 3 \times 10^5) ,代表字符串的长度 s

第二行是输入长度为 n 的字符串 s ,代表每个顶点的字母 U,L,R

接下来 n 行的 i-th 包含两个整数 l_ir_i(0 \le l_i,r_i \le n) 顶点 i 的左右子节点的索引。如果 l_i=0 则表示顶点 i 没有左子结点。如果是 r_i=0 ,则表示顶点 i 没有右子节点。可以保证这个数据描述的是一颗有效的二叉树,它的根节点是 1

对于所有的测试样例综合 n 不会超过 3 \times 10^5

输出格式
每个样例输出一个整数,我们到达叶子结点的最小操作数。

样例
Input 1
5
3
LRU
2 3
0 0
0 0
3
ULR
3 2
0 0
0 0
2
LU
0 2
0 0
4
RULR
3 0
0 0
0 4
2 0
7
LLRRRLU
5 2
3 6
0 0
7 0
4 0
0 0
0 0
Output 1
0
1
1
3
1

#include<bits/stdc++.h>
const int maxn=300005;
using namespace std;
int t,n;
int l[maxn],r[maxn];
string s;
int dfs(int i){
	if(i==0) return 0x3f3f3f3f;
    else if(l[i]==0&&r[i]==0) return 0;
	else return min(dfs(l[i])+s[i]!='L',dfs(r[i])+s[i]!='R');
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		cin>>s;
		s=" "+s;
		for(int i=1;i<=n;i++) scanf("%d%d",&l[i],&r[i]);
		printf("%d\n",dfs(1));
	}
	return 0;
}

改成return min(dfs(l[i])+(s[i]!='L'),dfs(r[i])+(s[i]!='R'));

优先级的问题

恭喜