求助!玄学!

P5018 [NOIP2018 普及组] 对称二叉树

确实挺“玄”,样例都对的但好像过不了,我先看看,把题做了
by 15167987933yy @ 2024-06-01 10:11:58


我是这么写的,里面加了注释,你可以看一下,可以过的 ``` #include<iostream> using namespace std; int n; //存放 结点权值 int val[1000050]; //son[i][0]:存放编号为i结点的左孩子编号 int son[1000050][2]; //size[i]:存放编号为i结点作为根节点时 子树的结点数量 int size[1000050]; void num(int u){ //根节点数量 size[u]=1; //如果有左子树 递归统计左子树结点数量 if(son[u][0]!=-1){ num(son[u][0]); size[u]+=size[son[u][0]]; } //如果有右子树 递归统计右子树结点数量 if(son[u][1]!=-1){ num(son[u][1]); size[u]+=size[son[u][1]]; } } //判断根节点u和v构成对应子树是否对称 bool check(int u,int v){ //两个子树为空树 则对称 if(u==-1 && v==-1){ return true; } if(u!=-1 && v!=-1 &&val[u]==val[v] && check(son[u][0],son[v][1]) && check(son[u][1],son[v][0])){ return true; } return false; } int main(){ //输入结点数量 cin>>n; //输入结点权值 for(int i=1;i<=n;i++){ cin>>val[i]; } //输入每个结点左右孩子编号 for(int i=1;i<=n;i++){ cin>>son[i][0];//左孩子编号 cin>>son[i][1];//右孩子编号 } /* 求最大对称子树的结点数量: 以每个结点作为根节点,找到所有可能的子树 判断当前子树是否对称 如果对称,通过比较所有对称子树结点数量,找到最大值 */ //统计每个结点作为根节点时 对应子树的结点数量 num(1); //存放最大对称子树的结点数量 int ans=0; //判断 每个结点为根节点时 对应子树是否对称 for(int i=1;i<=n;i++){ if(check(son[i][0],son[i][1])) ans=max(size[i],ans); } cout<<ans; } ```
by 15167987933yy @ 2024-06-01 11:21:50


|