自己写的纯递归80分,#17~#20、#22WA,自己电脑跑#17栈溢出
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
struct Node {
int value;
int left, right;
} tree[N];
bool cmp(int left, int right) {
if (left == -1 && right == -1) return true;
if (left * right < 0) return false;
return (tree[left].value == tree[right].value) && cmp(tree[left].left, tree[right].right) && cmp(
tree[left].right, tree[right].left);
}
int sum(int root) {
if (root == -1) return 0;
return sum(tree[root].left) + sum(tree[root].right) + 1;
}
int dfs(int root) {
int res = 0;
if (root == -1) return 0;
if (tree[root].left == -1 && tree[root].right == -1) return 1;
if (cmp(tree[root].left, tree[root].right)) res = 2 * sum(tree[root].left) + 1;
return max(res, max(dfs(tree[root].left), dfs(tree[root].right)));
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> tree[i].value;
for (int i = 1; i <= n; i++) cin >> tree[i].left >> tree[i].right;
cout << dfs(1) << endl;
return 0;
}
看题解减去一个递归76分,#17~22WA,自己电脑跑#17栈溢出
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
struct Node {
int value;
int left, right;
} tree[N];
bool cmp(int left, int right) {
if (left == -1 && right == -1) return true;
if (left * right < 0) return false;
return (tree[left].value == tree[right].value) && cmp(tree[left].left, tree[right].right) && cmp(
tree[left].right, tree[right].left);
}
int sum(int root) {
if (root == -1) return 0;
return sum(tree[root].left) + sum(tree[root].right) + 1;
}
int main() {
int n, res = 0;
cin >> n;
for (int i = 1; i <= n; i++) cin >> tree[i].value;
for (int i = 1; i <= n; i++) cin >> tree[i].left >> tree[i].right;
for (int i = 1; i <= n; i++) if (cmp(i, i)) res = max(res, sum(i));
cout << res;
return 0;
}
我自己电脑直接跑题解#17也是栈溢出