题目描述:

给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先。

输入:

输入可能包含多个测试样例。

对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数。

其中每个测试样例包括两行,第一行为一个二叉树的先序遍历序列,其中左右子树若为空则用0代替,其中二叉树的结点个数node_num<10000。

第二行为树中的两个结点的值m1与m2(0<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

【解题思路】首先是树的输入,这个利用中序遍历的特点递归输入就行。然后,我们需要判断给出的两个节点是否都在树中,不在直接输出非法信息。若都在树中则继续查找,这个时候我们需要递归查找,给定一个头节点和两个待查的节点值,首先判断如果节点值等于头结点的节点值,那么公共节点肯定就是头节点;否则,继续在头结点的左支和右支中间查找,若两个节点值分居左右支树中,那么公共节点肯定也就是头结点。否则我们可以通过左支或者右支返回的节点得到公共节点。

注意根节点需要通过传地址调用才能返回值,所以create参数是指针的指针。

AC code:

#include <cstdio>
#include <set>
using namespace std; struct nod
{
int val;
nod *lc,*rc;
}; set<int> setin; void create(nod **nd)
{
int tt;
scanf("%d",&tt);
if(tt==0) {nd=NULL; return;}
else
{
setin.insert(tt);
nod *newnd=new nod();
newnd->val=tt;
*nd=newnd;
create(&(newnd->lc));
create(&(newnd->rc));
}
} nod * lca(nod *nd,const int &n,const int &m)
{
if(!nd) return NULL;
if(nd->val==n || nd->val==m) return nd;
nod *lnd=lca(nd->lc,n,m);
nod *rnd=lca(nd->rc,n,m);
if(lnd && rnd) return nd;
return lnd?lnd:rnd;
} int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
nod *head=NULL;
setin.clear();
create(&head);
int n,m;
scanf("%d%d",&n,&m);
if(setin.find(n)==setin.end() || setin.find(m)==setin.end())
{
printf("My God\n");
continue;
}
nod *re=lca(head,n,m);
printf("%d\n",re->val);
}
return 0;
}
/**************************************************************
Problem: 1509
User: huo_yao
Language: C++
Result: Accepted
Time:160 ms
Memory:4988 kb
****************************************************************/

题目链接:http://ac.jobdu.com/problem.php?pid=1509

九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299

最新文章

  1. 百度推出新技术 MIP,网页加载更快,广告呢?
  2. Source Insight 3.X 标签插件v1.0发布
  3. Peter Norvig:自学编程,十年磨一剑
  4. win10 localhost 解析为 ipv6地址 ::1 的解决办法
  5. 微信 小程序 drawImage wx.canvasToTempFilePath wx.saveFile 获取设备宽高 尺寸问题
  6. Nginx + spawn-fcgi- Ubuntu中文
  7. Shell good example
  8. stl map高效遍历删除的方法 [转]
  9. pyQuery的安装
  10. 使用JPA TOOLS从数据库生成Entity文件
  11. 如何定制Sink扩展.Net Remoting功能
  12. C#中异步和多线程的区别
  13. Oracle EBS-SQL (CST-3):检查零成本交易.sql
  14. VisualStudio快捷键大全
  15. 利用 Saltstack 远程执行命令
  16. WebService访问oracle数据库本地调试
  17. 论一个蒟蒻的脑子里可以有多少坑(貌似咕了……目前更新保持在noip阶段)
  18. struts2框架学习之第二天
  19. Java Bug -- java.util.ConcurrentModificationException
  20. biopython

热门文章

  1. 期货、期权tick数据接收
  2. Codeforces 1207C Gas Pipeline (dp)
  3. SQL基础语法—insert语句
  4. docker-api的使用(java)
  5. android Seekbar 拖动按钮显示不全问题
  6. c#修改项目名称
  7. 概率DP (大概是最入门的题了) lightoj 1248
  8. 吴裕雄 python 机器学习——多项式贝叶斯分类器MultinomialNB模型
  9. JS-内置对象和方法
  10. 集合转换为数组toArray(),数组转换为集合asList()