P5018 对称二叉树

Posted for-miku

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P5018 对称二叉树相关的知识,希望对你有一定的参考价值。

链接:P5018

----------------------------------

这道题可以写暴力

------------------------------

暴力搜索,首先统计下每一个点的下属节点数,用来统计答案。

然后直接对称搜索就行

 

-------------------------------

技术图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 int son[10000001][2]//左右儿子;
 7 int size[1000001];
 8 int n;
 9 int v[1000001];
10 int ans;
11 void dfs(int now)
12     size[now]=1;//统计包括自己在内的下属节点数 
13     if(-1!=son[now][1])
14         dfs(son[now][1]);
15         size[now]+=size[son[now][1]];//有儿子就加上儿子的 
16     
17     if(son[now][0]!=-1)
18         dfs(son[now][0]);
19         size[now]+=size[son[now][0]];
20     
21 
22 bool check(int x,int y)
23     if(x==-1&&y==-1)//单独的一个儿子或者说都没有节点肯定对称 
24     return 1;
25     if(x!=-1&&y!=-1&&v[x]==v[y]&&check(son[x][1],son[y][0])&&check(son[x][0],son[y][1]))
26     //到了这一层,如果还有-1,就一定不对称了
27     //值要 相等
28     //对称搜索下一层 
29     return 1;
30     return 0;    
31     
32 
33 
34 int main()
35     scanf("%d",&n);
36     for(int i=1;i<=n;++i)
37         scanf("%d",&v[i]);
38     
39     for(int i=1;i<=n;++i)
40         scanf("%d%d",&son[i][0],&son[i][1]);
41     
42     dfs(1); 
43     int ans=0;
44     for(int i=1;i<=n;++i)
45         if(check(son[i][1],son[i][0]))//搜索儿子 
46         
47             ans=max(ans,size[i]);
48         
49     
50     cout<<ans;
51 return 0;
52 
Ac

 

以上是关于P5018 对称二叉树的主要内容,如果未能解决你的问题,请参考以下文章

[Luogu P5018] 对称二叉树

Java集合与数据结构——二叉树03

100天算法入门 - 每日三题 - Day6对称二叉树二叉树的最大深度将有序数组转换为二叉搜索树

面试---算法面试

数据结构树相关代码(数据结构笔试复测Leecode牛客)

薪火传算法专栏十四 二叉树