问题标题: 求助!4274 对称二叉树!

10
0
已解决
包涵宇
包涵宇
中级天翼
中级天翼

样例二不对!!!

代码:

#include<iostream>
#include<cstring>
using namespace std;	
int s=1;
long long n,a[15][3],zh[15],t,tt,map[15][15],dis[15];
bool check(int x){
	for(int i=2;i<=x;i++)
		for(int j=1;j<=dis[i];j++)
			if(map[i][j]!=map[i][dis[i]-j+1])
				return 0;
	return 1;
}
int shu(int x){
	if(x==1)return 1;
	int c=1,s=0;
	for(int i=2;i<=x;i++)c*=2,s+=c;
}
long long dfs(int x,int cs){
	if(a[x][1]==-1&&a[x][2]!=-1||a[x][1]!=-1&&a[x][2]==-1)return cs-1;
	if(a[x][1]==-1&&a[x][2]==-1)return cs-1;
	dis[cs]++,map[cs][dis[cs]]=zh[a[x][1]],dis[cs]++,map[cs][dis[cs]]=zh[a[x][2]];
	if(check(cs)){
		int tmp=min(dfs(a[x][1],cs+1),dfs(a[x][2],cs+2));
		if(check(tmp)){
			s=max(s,max(shu(cs),shu(tmp)));
		}
		else s=max(s,shu(cs));
	}
	map[cs][dis[cs]]=0;
	dis[cs]--;
	map[cs][dis[cs]]=0;
	dis[cs]--;
	return cs-1;
}
int main(){
 	cin>>n;
 	for(int i=1;i<=n;i++)cin>>zh[i];
 	for(int i=1;i<=n;i++){
 		cin>>t>>tt;
 		a[i][1]=t;
 		a[i][2]=tt;
	}
	for(int i=1;i<=n;i++){
		memset(map,0,sizeof(map));
		map[1][1]=zh[i];
		dis[1]=1;
		dfs(i,1);
	}
	cout<<s;
	return 0;
} 

注释:

1.a[i][1]编号为i的父节点的左孩子,a[i][2]编号为i的父节点的右孩子

2.shu(x):深度为x的完全二叉树的节点数量

完全二叉树:

        O

      |    |

    O     O

  |    |   |    |

 O   O O  O

(像这样)

紧急求助QWQ

@董子墨 

@黄子澄 

!!!!!

@各位大佬!!!

速答!!!

 

 

 

包涵宇在2020-11-01 11:40:48追加了内容

d!

包涵宇在2020-11-01 12:44:39追加了内容

顶!

包涵宇在2020-11-01 14:53:34追加了内容

顶!

包涵宇在2020-11-01 15:56:04追加了内容

d!

包涵宇在2020-11-01 16:01:11追加了内容

我看了一下,他说必须是子树,所以我的代码还要改一改,求修改意见!!!

(请大家点赞,我想上精品贴)

包涵宇在2020-11-03 20:11:58追加了内容

新代码!!!15分

#include<iostream>
#include<cstring>
using namespace std;	
int s=1;
long long n,a[15][3],zh[15],t,tt,map[15][15],dis[15];
bool check(int x){
	//if(x%2==0)return 0;
	for(int i=2;i<=x;i++)
		for(int j=1;j<=dis[i];j++)
			if(map[i][j]!=map[i][dis[i]-j+1])
				return 0;
	return 1;
}
int shu(int x){
	if(x==1)return 1;
	int c=1,s=1;
	for(int i=2;i<=x;i++)c*=2,s+=c;
	return s;
}
long long dfs(int x,int cs){
	if(a[x][1]==-1&&a[x][2]!=-1||a[x][1]!=-1&&a[x][2]==-1)return -1;
	if(a[x][1]==-1&&a[x][2]==-1)return cs-1;
	dis[cs]++,map[cs][dis[cs]]=zh[a[x][1]],dis[cs]++,map[cs][dis[cs]]=zh[a[x][2]];
	if(check(cs)){
		int tmp=min(dfs(a[x][1],cs+1),dfs(a[x][2],cs+1));
		if(tmp!=-1&&check(tmp)){
			s=max(s,max(shu(cs),shu(tmp)));
		}
		else s=max(s,shu(cs));
	}
	map[cs][dis[cs]]=0;
	dis[cs]--;
	map[cs][dis[cs]]=0;
	dis[cs]--;
	return -1;
}
int main(){
 	cin>>n;
 	for(int i=1;i<=n;i++)cin>>zh[i];
 	for(int i=1;i<=n;i++){
 		cin>>t>>tt; 
 		a[i][1]=t;
 		a[i][2]=tt;
	}
	for(int i=1;i<=n;i++){
		memset(map,0,sizeof(map));
		map[1][1]=zh[i];
		dis[1]=1;
		dfs(i,1);
	}
	cout<<s;
	return 0;
} 

 

包涵宇在2020-11-05 18:48:53追加了内容

大家快答啊~

包涵宇在2020-11-05 21:09:06追加了内容

快回答!!!


2
已采纳
赵逸凡
赵逸凡
初级启示者
初级启示者

map是某个头文件的关键字,您用它来做变量名???

脑洞清奇,实在看不懂,明明一道建树水题,这里提供思路:

输入->递归从小往大统计子树结点数目->统计时检查二叉树是否对称->输出最大节点数->AC

0
0
康曦
康曦
中级光能
中级光能

这个除了赵大佬和黄大佬没人会啊

0
蔡乐毅
蔡乐毅
高级光能
高级光能

一个树是对称的这样判断

first:他的节点是不是奇数个

second:

        O

    |        |

    A      B

|    |    |        |

C    D    E    F

A=B

如何实现?

递归!

一个节点是对称的

不然就要求

C=F&&D=E

蔡乐毅在2020-11-03 21:20:41追加了内容

@包涵宇 用递归!

 

蔡乐毅在2020-11-05 19:46:43追加了内容

我答啦!

0
0
0
王子逸
王子逸
新手天翼
新手天翼

龙舟就做出来了

估计是抄的!

他连递归都没学!

0
赵逸凡
赵逸凡
初级启示者
初级启示者

您这15分说明样例很水,起码连一般的完全二叉树做法都能得分,感觉你没学过树吧。不然不可能直接用完全二叉树做法的啊(而且还是纯模拟)

我要回答