通过createtree函数,tree数组中每个元素的值都是以这个元素为根节点,左右子树的节点数量(包含根节点)。
判断一棵子树是否符合对称二叉树需要满足以下几点:1.根节点有左右孩子且权值相等 2.根节点没有左右孩子
#include <iostream>
using namespace std;
const int maxn = 1000010;
int val[maxn];//每个节点的权值
int lc[maxn];//左孩子
int rc[maxn];//右孩子
int tree[maxn];//记录每个根节点有几个孩子
int res;
int createtree(int root) {
tree[root] = 1;
if (lc[root] != -1) {
tree[root] += createtree(lc[root]);
}
if (rc[root] != -1) {
tree[root] += createtree(rc[root]);
}
return tree[root];
}
bool check(int root1, int root2) {
if (root1 != -1 && root2 != -1) {
if (val[root1] != val[root2])return false;
return check(lc[root1], rc[root2]) && check(rc[root1], lc[root2]);
}
else if (root1 == -1 && root2 == -1)return true;
else return false;
}
void calc(int root) {
if (root == -1)return; // if (root == -1||tree[root]<res)return;
if (check(root, root))res = max(res, tree[root]);
calc(lc[root]);
calc(rc[root]);
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)cin >> val[i];
for (int i = 1; i <= n; i++) {
cin >> lc[i] >> rc[i];
}
//createtree(1);
calc(1);
cout << res;
}


京公网安备 11010502036488号