题目1509:树中两个结点的最低公共祖先
2015-09-08 16:20
337 查看
http://ac.jobdu.com/problem.php?pid=1509
题目描述:
给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个数n ,n<1000,代表测试样例的个数。
其中每个测试样例包括两行,第一行为一个二叉树的先序遍历序列,其中左右子树若为空则用0代替,其中二叉树的结点个数node_num<10000。
第二行为树中的两个结点的值m1与m2 m1,m2<10000。
输出:
对应每个测试案例,
输出给定的树中两个结点的最低公共祖先结点的值,若两个给定结点无最低公共祖先,则输出“My God”。
样例输入:
2
1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0
6 8
1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0
6 12
样例输出:
2
My God
题目描述:
给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个数n ,n<1000,代表测试样例的个数。
其中每个测试样例包括两行,第一行为一个二叉树的先序遍历序列,其中左右子树若为空则用0代替,其中二叉树的结点个数node_num<10000。
第二行为树中的两个结点的值m1与m2 m1,m2<10000。
输出:
对应每个测试案例,
输出给定的树中两个结点的最低公共祖先结点的值,若两个给定结点无最低公共祖先,则输出“My God”。
样例输入:
2
1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0
6 8
1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0
6 12
样例输出:
2
My God
// http://ac.jobdu.com/problem.php?pid=1509 #include<stdio.h> #include<stack> #include<iostream> using namespace std; #define N 10005 typedef struct node{ int data; struct node *left,*right; node(int _data = -1) { data = _data ; left = NULL; right = NULL; } }Bnode; bool shu ; Bnode* createTree(Bnode* head) { int data ; scanf("%d",&data); // 每次都需要输入数据 if(data == 0) { return NULL ; }else{ head = new node(data); shu[data] = true ; head->left = createTree(head->left); // 递归 左子树 head->right = createTree(head->right); // 递归 右子树 } return head ; } int Apre ,Bpre ; // 先序遍历查找A B 时每个节点的parent int fa,fb; bool oka,okb; void finda(Bnode* head) { if(oka) return ; if(head->data == fa) { oka = true; return ; } if(head->left != NULL) { if(head->left->data != head->data) Apre[head->left->data] = head->data; // finda(head->left) ; // 递归查找 } if(head->right != NULL) { if(head->right->data != head->data) Apre[head->right->data] = head->data; finda(head->right) ; // 递归查找 } } void findb(Bnode* head) { if(okb) return ; if(head->data == fb) { okb = true; return ; } if(head->left != NULL) { if(head->left->data != head->data) Bpre[head->left->data] = head->data; findb(head->left) ; } if(head->right != NULL) { if(head->right->data != head->data) Bpre[head->right->data] = head->data; findb(head->right) ; } } int main() { // freopen("in.txt","r",stdin); int t; while(scanf("%d",&t)!=EOF) while(t--) { int i ; for(i = 0 ; i <= 10000 ; i ++){ shu[i] = false; Apre[i] = -1; Bpre[i] = -1; } Bnode* head = NULL; head = createTree(head); oka = false; okb = false ; scanf("%d%d" , &fa , &fb); if(shu[fa] == false || shu[fb] == false) { printf("My God\n"); }else{ finda(head); stack<int> sta; // 存放fa和他的所有祖先 int p = fa; sta.push(p); while(Apre[p] != -1) { p = Apre[p]; sta.push(p); } findb(head); stack<int> stb; // 存放fb和他的所有祖先 p = fb; stb.push(p); while(Bpre[p] != -1) { p = Bpre[p]; stb.push(p); } int root = -1 ; // 找最近的公共祖先 while(!sta.empty() && !stb.empty() && sta.top() == stb.top()) { root = sta.top(); sta.pop(); stb.pop(); } if(root == -1) printf("My God\n"); else printf("%d\n",root); } } return 0; }
相关文章推荐
- 百度地图的定位
- 2015腾讯笔试题-基于递归的格雷码生成
- 网络通信之网络图片获取 并显示屏幕上
- CStdioFile的WriteString 不能写汉字或英文的解决办法
- JS屏蔽页面某些按键的响应
- 我如何介绍 Microservice
- 4.3 Writing a Grammar
- rostopic pub
- shell中特殊变量$0 $1 $# $$ $! $?的涵义
- DBPwAudit -数据库密码破解工具的使用
- DelayQueue Demo
- 算法汇总(测试算法具体时间和效率)
- 利用Ehcache实现支付超时限制
- 4.2 Context-Free Grammars
- Window I/O 完成端口 (Windows I/O Completion Port (IOCP))
- mysql 写入优化
- web前端学习路线推荐(讲的很细致)
- 关于Java中File的renameTo函数
- Controlling WebBrowser Control Compatibility
- phpMyAdmin 安装配置