题目描述:

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

输入:

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

对于每个测试案例,输入的第一行为一个数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

【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ的更多相关文章

  1. (剑指Offer)面试题50:树中两个结点的最低公共祖先

    题目: 求树中两个结点的最低公共祖先 思路: 考虑一下几种情况: 1.该树为二叉搜索树 二叉搜索树是排序树,位于左子树点的结点都比父结点小,而位于右子树的结点都比父结点大,只需要从树的根结点开始和两个 ...

  2. 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先

    剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...

  3. 《剑指offer》第六十八题(树中两个结点的最低公共祖先)

    // 面试题68:树中两个结点的最低公共祖先 // 题目:输入两个树结点,求它们的最低公共祖先. #include <iostream> #include "Tree.h&quo ...

  4. 【剑指Offer学习】【面试题50:树中两个结点的最低公共祖先】

    题目:求树中两个结点的最低公共祖先,此树不是二叉树,而且没有指向父节点的指针. 树的结点定义 private static class TreeNode { int val; List<Tree ...

  5. 【Java】 剑指offer(68) 树中两个结点的最低公共祖先

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个树结点,求它们的最低公共祖先. 思路 该题首先要和面试 ...

  6. 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ

    题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n&l ...

  7. 【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ

    题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=10 ...

  8. 【剑指Offer面试编程题】题目1506:求1+2+3+...+n--九度OJ

    题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 输入: 输入可能包含多个测试样例. 对于每个 ...

  9. 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ

    题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...

随机推荐

  1. Android开发实战——记账本(4)

    开发日志(4)——MainActivity 在MainActivity中编写了几个方法.首先,点击账本的一条记录可以选择删除他,然后重写了fab,使之在点击他后能够添加记录.还写了删除全部记录的方法. ...

  2. es8中对string补白的方式

    //允许将空字符串或其他字符串添加到原始字符串的开头或结尾for(let i = 1; i < 32; i++) { if(i < 10) { console.log(`0{i}`) }e ...

  3. 概率dp lightoj 1342

    题意:有N根木棍,每根木棍都有一个权值 其中有若干根可识别,若干根不可识别的,抽到了可识别的棍子,就不放回,抽到了不可识别的,就要放回 ,问所有棍子都至少被抽过一次后权值和的期望 不可识别的棍子,就相 ...

  4. React的React.createContext()源码解析(四)

    一.产生context原因 从父组件直接传值到孙子组件,而不必一层一层的通过props进行传值,相比较以前的那种传值更加的方便.简介. 二.context的两种实现方式 1.老版本(React16.x ...

  5. Httpclient 工具类(get,put)

    package com.googosoft.until; import java.io.IOException; import org.apache.http.HttpEntity; import o ...

  6. Android学习11

    Android存储概念 File内部存储 通过file=openFileOutput()获得,将数据存储在data/data/+包名+files下面. layout布局文件: <?xml ver ...

  7. java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [META-INF/services/com.alibaba.druid.filter.Filter].

    九月 11, 2019 2:56:36 下午 org.apache.catalina.loader.WebappClassLoaderBase checkStateForResourceLoading ...

  8. 使用Docker搭建Spark集群(用于实现网站流量实时分析模块)

    上一篇使用Docker搭建了Hadoop的完全分布式:使用Docker搭建Hadoop集群(伪分布式与完全分布式),本次记录搭建spark集群,使用两者同时来实现之前一直未完成的项目:网站日志流量分析 ...

  9. vue去掉地址栏# 方法

    超简单 export default new Router({ //将mode 设置为‘history‘ 即可.默认情况是’hash’ 所以会有丑陋的# mode: 'history', routes ...

  10. [C++]蛇形填数

    [从左下角开始,逆时针蛇形填数] #include <iostream> using namespace std; int main() { int n; cin>>n; in ...