NYNU_省赛选拔题(3)
2016-03-13 13:49
369 查看
题目描述
二叉树,若其与自己的镜像完全相同,就称其为镜像树。是一棵镜像树;
而
不是镜像树。
现给你一棵二叉树,请你判断其是不是镜像树。
输入
第一行是一个整数数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”,每个输出单独占一行样例输入
2 7 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
样例输出
Yes No
#include <iostream> using namespace std; bool flag=1; struct node { int data; int lchild,rchild; }t[150]; void dfs(int r1,int r2) { if(r1==0&&r2==0) return ; else if(r1==0&&r2!=0||r1!=0&&r2==0||t[r1].data!=t[r2].data) { flag=0; return ; } dfs(t[r1].lchild,t[r2].rchild); dfs(t[r1].rchild,t[r2].lchild); } int main() { int i,j,T,n; cin>>T; while(T--) { cin>>n; for(i=1;i<=n;i++) { int k; cin>>k; cin>>t[i].lchild>>t[i].rchild; } for(i=1;i<=n;i++) cin>>t[i].data; flag=1; dfs(t[1].lchild,t[1].rchild); if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }
相关文章推荐
- HBASE---数据存储实践
- SpringMVC中传入的对象存放在哪里
- hdu-5643 King's Game(打表)
- epoll+thread pool 服务器简单实例
- Android界面性能调优(转载记录)
- 一个ListView根据标识加载不同布局,很简单的例子,就是聊天界面,你说话在右边好友在左边怎么实现呢.
- Eratosthenes筛计算N以内的素数
- 数组的地址(指针)
- IE8下提示'console'没有定义错误
- 兔子--html,js,php,ASP,ASP.NET,JSP的关系
- 1500: [NOI2005]维修数列
- 文章标题
- 自定义Log
- FastSocket.Net
- 第三周项目4:穷举法解决组合问题
- Android MainActivity如何加载BaseActivity的布局
- java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序
- Object-C学习笔记——内存管理
- C语言指针函数链表复习
- Java Socket编程详解