镜像树(dfs)
1214: J.镜像树
时间限制: 1 Sec 内存限制: 64 MB提交: 18 解决: 7
题目描述
一棵二叉树,若其与自己的镜像完全相同,就称其为镜像树(即这棵二叉树关于根完全对称)。例如
是一棵镜像树;
而
不是镜像树。
现给你一棵二叉树,请你判断其是不是镜像树。
输入
第一行是一个整数数T,表示测试数据有多少组
每组数据第一行是一个正整数n(1<=n<=100),表示二叉树中节点的数量
下面n行,每行有三个正整数a b c(1<=a<=100,0<=b,c<=100),表示以编号a的节点为父节点,它的左孩子节点编号为b,右孩子节点编号为c,若b=0表示没有左孩子节点,c=0表示没有右孩子节点,树的根节点是编号为1的节点,节点的编号都>=1(保证数据中给出的二叉树拓扑结构是合法的)
下面一行是n个正整数vi(1<=vi<=100),表示编号为i的节点的值。
输出
若数据中表示的二叉树是镜像树,输出“Yes”,否则输出“No”,每个输出单独占一行
样例输入
Sample Input
2
7 //结点
1 2 3 //结点1的左孩子是结点2 右孩子是结点3
2 4 5
3 6 7
4 0 0
5 0 0
6 0 0
7 0 0
1 2 2 3 4 4 3 //权值
5
1 2 3
2 0 4
3 0 5
4 0 0
5 0 0
1 2 2 3 3
Sample Output
Yes
No
1 #include <iostream> 2 using namespace std; 3 bool flag=1; 4 struct node 5 { 6 int data; 7 int lchild,rchild; 8 9 }t[150]; 10 void dfs(int r1,int r2) 11 { 12 if(r1==0&&r2==0) 13 return ; 14 else if(r1==0&&r2!=0||r1!=0&&r2==0||t[r1].data!=t[r2].data) 15 { 16 flag=0; 17 return ; 18 } 19 dfs(t[r1].lchild,t[r2].rchild); 20 dfs(t[r1].rchild,t[r2].lchild); 21 } 22 int main() 23 { 24 int i,j,T,n; 25 freopen("in.txt","r",stdin); 26 cin>>T; 27 while(T--) 28 { 29 cin>>n; 30 for(i=1;i<=n;i++) 31 { 32 int k; 33 cin>>k; 34 cin>>t[i].lchild>>t[i].rchild; 35 } 36 for(i=1;i<=n;i++) 37 cin>>t[i].data; 38 flag=1; 39 dfs(t[1].lchild,t[1].rchild); 40 if(flag) 41 cout<<"Yes"<<endl; 42 else 43 cout<<"No"<<endl; 44 } 45 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步