题目:

求树中两个结点的最低公共祖先

思路:

考虑一下几种情况:

1、该树为二叉搜索树

二叉搜索树是排序树,位于左子树点的结点都比父结点小,而位于右子树的结点都比父结点大,只需要从树的根结点开始和两个输入的结点进行比较。

如果当前结点的值比两个结点的值都大,那么最低的公共父结点一定在左子树,下一步就是遍历左子树;

如果当前结点的值比两个结点的值都小,那么最低的公共父结点一定在右子树;下一步就是遍历右子树;

如果当前结点的值介于两个结点的值之间,那么它就是两个结点的公共父结点,第一个找到的就是最低的公共父结点。

2、该树为二叉树,结点中有指向父结点的指针

有了父结点,就可以找到任意结点到根结点的路径;因此:

分别找到从两个结点开始到根结点的路径,即两个链表;

然后找到两个链表的第一个公共结点,就是最低的公共父结点;

3、该树为普通的树

从根结点开始,通过广度优先搜索,分别找到到达两个结点的路径;

然后找到两条路径的第一个公共结点,就是最低的公共父结点;

代码:

暂时先实现第三种条件

struct TreeNode{
int val;
vector<TreeNode*> children;
}; bool GetNodePath(TreeNode* pRoot,TreeNode* pNode,list<TreeNode*> &path){
if(pRoot==pNode)
return true;
path.push_back(pRoot); vector<TreeNode*>::iterator it=pRoot->children.begin();
bool found = false;
while(!found && it!=pRoot->children.end()){
found=GetNodePath(*it,pNode,path);
++it;
} if(!found)
path.pop_back(); return found;
} TreeNode* GetLastCommonNode(const list<TreeNode*> &path1,const list<TreeNode*> &path2){
list<TreeNode*>::const_iterator it1=path1.begin();
list<TreeNode*>::const_iterator it2=path2.begin(); TreeNode* pLast=NULL; while(it1!=path1.end() && it2!=path2.end()){
if(*it1==*it2)
pLast=*it1;
it1++;
it2++;
}
return pLast;
} TreeNode* GetLastCommonParent(TreeNode* pRoot,TreeNode* pNode1,TreeNode* pNode2){
if(pRoot==NULL || pNode1==NULL || pNode2==NULL)
return NULL;
list<TreeNode*> path1;
GetNodePath(pRoot,pNode1,path1); list<TreeNode*> path2;
GetNodePath(pRoot,pNode2,path2); return GetLastCommonNode(path1,path2);
}

(剑指Offer)面试题50:树中两个结点的最低公共祖先的更多相关文章

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

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

  2. 【Offer】[68] 【树中两个结点的最低公共祖先】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两个树结点,求它们的最低公共祖先. [牛客网刷题地址]无 思路分析 该题首先要确定是否为二叉树,还要确定是否为二叉搜索树,是否有父指 ...

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

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

  4. 【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ

    题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...

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

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

  6. 树中两个结点的最低公共祖先--java

    题目:对于任意一个树,不仅仅限于二叉树,求树中两个结点的最低公共祖先结点. 解析:对于任意一棵树,显然并不局限于二叉树,也就是说树的非叶子结点可能存在多个子节点.所以,我们可以定义两个链表结构,存储这 ...

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

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

  8. [jobdu]树中两个结点的最低公共祖先

    http://ac.jobdu.com/problem.php?pid=1509 此题最直观的方法是两次DFS,分别找到这两个节点的path,然后遍历path1和path2做比较,找到最后一个共同的元 ...

  9. Lowest Common Ancestor of a Binary Search Tree(树中两个结点的最低公共祖先)

    题目描述: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in ...

随机推荐

  1. WebApi使用JWT认证(二)

    这是第二部:实现NetCore上的WebApi使用JWT认证 1.NetCore新建一个WebApi的项目 2.打开AppSettings.json,添加Jwt的信息,这里为了演示而已 { " ...

  2. python tesseract 识别图片中的文字的乱码问题(ubuntu系统下)

    OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程. 首先,需要安装 tesseract-ocr(tesseract O ...

  3. 2017-2018-1 JAVA实验站 冲刺 day03

    2017-2018-1 JAVA实验站 冲刺 day03 各个成员今日完成的任务 小组成员 今日工作 完成进度 张韵琪 写博客.进行工作总结 100% 齐力锋 部分按钮图片.对按钮图片进行ps 100 ...

  4. setResult()的调用时机

    今天遇到这样一个问题,我在Activity-A中用startActivityForResult()方法启动了Activity-B,并且在B中通过setResult()方法给A返回值,由于某些原因不能在 ...

  5. 关于收到谷歌邮件 Googlebot can't access your site 的解决方法

    最近一段时间一直都收到谷歌的邮件,而且“新锐工作室”的关键字在谷歌收录及排名都没有了.下面图为谷歌蜘蛛无法抓取网站的截图,如果你在谷歌网管工具里收到类似消息,说明也中招了.[Webmaster Too ...

  6. visual stuidio2010 在iis中调试。

    1 你的电脑装好IIS. 这是必须的. 2.更改.NET Framework 版本为你的项目所用的版本. 应用程序池对应的.NET Framework 版本也都要对应. 3将你电脑的默认网站目录定位到 ...

  7. Microsoft Visual Studio 2010导致系统C盘不断增大问题处理。

    一直用Microsoft Visual Studio 2010做开发,发现最近C盘空间是越来越小,一开始以为是IE或者一些系统补丁造成的临时文件,但是使用360,windows优化大师之类的软件都清过 ...

  8. PWM DAC Low Pass Filtering

    [TI博客大赛][原创]LM3S811之基于PWM的DAC http://bbs.ednchina.com/BLOG_ARTICLE_3005301.HTM http://www.fpga4fun.c ...

  9. Android的Master/Detail风格界面中实现自定义ListView的单选

    原文在这里:http://duduli.iteye.com/blog/1453576 可以实现多选,那么如何实现单选呢,这里我写了一个非常简单的方法: public void onListItemCl ...

  10. kernel-release为 2.6.35-32-generic 详解

    linux distribution通常会在这三个版本号后加入后缀,用以描述其他信息,以我的Unbuntu 10.10为例: kernel-release为 2.6.35-32-generic(有的为 ...