1 solutions
-
0
模拟(树形dp 100pts)
- 设计判断两棵子树是否对称的结构
- 统计子树的节点数目
- 统计对称子树的节点的最大值
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; struct Tree{ //二叉树节点 int l,r; int v; }tr[N]; int s[N]; int ans=0; bool check(int l,int r) //判断对称 { if(!l||!r) return !l&&!r; //如果有一个为空,则左右都是空为真 if(tr[l].v!=tr[r].v) return false; //值不相等 return check(tr[l].l,tr[r].r)&&check(tr[l].r,tr[r].l); //递归判断({左左,右右},{左右,右左}) } int dfs1(int r) //统计每棵子树的节点数目 { if(r==0) return 0; s[r]=dfs1(tr[r].l)+dfs1(tr[r].r)+1; return s[r]; } void dfs2(int r) //递归找对称子树的最大节点数 { if(r==0) return ; if(check(tr[r].l,tr[r].r)) //对称则更新答案 { ans=max(ans,s[r]); } dfs2(tr[r].l); //递归计算左子树 dfs2(tr[r].r); //递归计算右子树 } int main() { int n; cin>>n; for(int i=1;i<=n;i++) //获取节点值 { cin>>tr[i].v; } for(int i=1;i<=n;i++) { int l,r; cin>>l>>r; if(l!=-1) tr[i].l=l; if(r!=-1) tr[i].r=r; } dfs1(1); //统计每棵子树的节点数目 dfs2(1); //寻找对称节点的最大子树节点 cout<<ans; return 0; }
- 1
Information
- ID
- 1062
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- # Submissions
- 7
- Accepted
- 3
- Uploaded By