NC21241. 对称二叉树
描述
现在给出一棵二叉树,希望你找出它的一棵子树,该子树为对称二叉树,且节点数 最多。请输出这棵子树的节点数。
注意:只有树根的树也是对称二叉树。本题中约定,以节点 T为子树根的一棵“子树”指的是:节点T和它的全部后代节点构成的二叉树。
输入描述
第一行一个正整数 𝑛,表示给定的树的节点的数目,规定节点编号 1~n,其中节点1 是树根。
第二行 𝑛 个正整数,用一个空格分隔,第 𝑖 个正整数 𝑣𝑖 代表节点 𝑖 的权值。
接下来 𝑛 行,每行两个正整数 𝑙 , 𝑟 ,分别表示节点 𝑖 的左右孩子的编号。如果不存在左 / 右孩子,则以 −1 表示。两个数之间用一个空格隔开。
输出描述
输出文件共一行,包含一个整数,表示给定的树的最大对称二叉子树的节点数。
示例1
输入:
2 1 3 2 -1 -1 -1
输出:
1
说明:
示例2
输入:
10 2 2 5 5 5 5 4 4 2 3 9 10 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 3 4 5 6 -1 -1 7 8
输出:
3
说明:
C++(g++ 7.5.0) 解法, 执行用时: 294ms, 内存消耗: 12116K, 提交时间: 2023-02-03 20:03:23
#include<bits/stdc++.h> using namespace std; const int N=1e6+5; int n,mx,arr[N],node[N][2]; bool work(int l,int r) { if(l==-1&&r==-1) return 1; if(l==-1||r==-1) return 0; if(arr[l]!=arr[r]) return 0; mx+=2; return work(node[l][0],node[r][1])&&work(node[l][1],node[r][0]); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&arr[i]); for(int i=1;i<=n;i++) scanf("%d%d",&node[i][0],&node[i][1]); int ans=1; for(int i=1;i<=n;i++) { mx=1; if(work(node[i][0],node[i][1])) ans=ans>mx?ans:mx; } printf("%d\n",ans); return 0; }
Pascal(fpc 3.0.2) 解法, 执行用时: 401ms, 内存消耗: 25444K, 提交时间: 2018-11-24 10:01:39
var a,l,r:array[1..1000000]of longint; n,i,k,max:longint; function dfs(x,y:longint):longint; var p,q:longint; begin if(x=-1)and(y=-1)then exit(0); if(x=-1)or(y=-1)or(a[x]<>a[y])then exit(-1); p:=dfs(l[x],r[y]); q:=dfs(r[x],l[y]); if(p=-1)or(q=-1)then exit(-1); exit(p+1+q+1); end; begin readln(n); for i:=1 to n do read(a[i]); readln; for i:=1 to n do readln(l[i],r[i]); for i:=1 to n do begin k:=dfs(l[i],r[i]); if k>max then max:=k; end; writeln(max+1); end.
C++(clang++ 11.0.1) 解法, 执行用时: 613ms, 内存消耗: 12136K, 提交时间: 2023-02-19 20:53:19
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; int n,a[N][2],b[N],maxi; bool p(int l,int r){ if(l==-1&&r==-1) return 1; if(l==-1||r==-1) return 0; if(b[l]!=b[r]) return 0; maxi+=2; return p(a[l][0],a[r][1])&&p(a[r][0],a[l][1]); } int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>b[i]; for(int i=1;i<=n;i++){ cin>>a[i][0]>>a[i][1]; } int maxj=1; for(int i=1;i<=n;i++){ maxi=1; if(p(a[i][0],a[i][1])) if(maxi>maxj)maxj=maxi; } cout<<maxj; }