http://ac.jobdu.com/problem.php?pid=1509

此题最直观的方法是两次DFS,分别找到这两个节点的path,然后遍历path1和path2做比较,找到最后一个共同的元素。这个普通的做法在:http://blog.csdn.net/thyftguhfyguj/article/details/9232901

但有个更好的办法能够一次DFS中找到,没有O(logN)的额外空间。参见:http://www.cnblogs.com/lyunyu/archive/2013/05/11/3073529.html

现在这段代码有一个用例没有过,应该是没有同时找到两个节点(比如只找到一个)。这样可以放两个是否找到a和b的bool,最后有用,但这样代码会复杂不少。过会再做。(http://www.cnblogs.com/remlostime/archive/2012/11/26/2788795.html)现在这段代码只适用于两个子节点都有的情况。

但事实上LCA是一个成熟的算法,参考:http://wenku.baidu.com/view/6918633343323968011c92f4.html 有空回来再研究(看了一下,那个好像是基于并查集的离线算法)。

如果是二叉排序树,则可利用左右大小的性质:http://www.cnblogs.com/lautsie/p/3269174.html

#include <cstdio>
#include <iostream>
using namespace std; struct Node{
int x;
struct Node *left;
struct Node *right;
}; void createTree(Node *&root){
int x;
scanf_s("%d",&x);
if(!x)
root = NULL;
else{
root = new Node;
root->x = x;
createTree(root->left);
createTree(root->right);
}
} Node* getCommonNode(Node *&root, int a, int b){
if (root == NULL) {
return NULL;
}
else if (root->x == a || root->x == b){
return root;
}
else {
Node* rl = getCommonNode(root->left, a, b);
Node* rr = getCommonNode(root->right, a, b);
if (rl != NULL && rr != NULL) return root;
else {
Node* res = (rl != NULL) ? rl : rr;
return res;
}
}
} void destory(Node *&root){
if(root){
destory(root->left);
destory(root->right);
delete root;
root = NULL;
}
} void print(Node *root){
if(root){
printf("%d ",root->x);
print(root->left);
print(root->right);
}
} int main()
{
int n,a,b;
while(scanf_s("%d",&n) != EOF){
while(n--){
Node *root;
createTree(root);
scanf_s("%d %d",&a,&b);
Node * res = getCommonNode(root, a, b);
if (res != NULL) {
printf("%d\n", res->x);
}
else {
printf("My God\n");
}
destory(root);
}
}
return 0;
}

  

[jobdu]树中两个结点的最低公共祖先的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. akka构建简单分布式应用

    http://www.cnblogs.com/hequn/articles/3764630.html 当程序的要求达到一台计算机的极限时,我们便需要将程序分布式化,让程序运行在多台计算机上.akka提 ...

  2. ASP.NET网络硬盘(文件上传,文件下载)

    文件上传: 界面: 前台代码: <body style="text-align: center; background-image: url(Images/bg6.bmp);" ...

  3. SQL server 数据库日志文件过大清空日志文件

    SQL2008:'在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完全模式. USE [master] GO ALTER DATABASE DBName SET RECOVER ...

  4. -exec和|xargs

    注意xargs会被空格割裂,所以遇到带有空格的文件名就不好办了,解决方法是使用-print0 例如:删除.目录下30天之前的.png文件 -type f -name rm 或者使用-exec:删除.目 ...

  5. C# lazy加载

    转自http://www.cnblogs.com/yunfeifei/p/3907726.html 在.NET4.0中,可以使用Lazy<T> 来实现对象的延迟初始化,从而优化系统的性能. ...

  6. bzoj2287:[POJ Challenge]消失之物

    思路:首先先背包预处理出f[x]表示所有物品背出体积为x的方案数.然后统计答案,利用dp. C[i][j]表示不用物品i,组成体积j的方案数. 转移公式:C[i][j]=f[j]-C[i][j-w[i ...

  7. OpenJudge/Poj 1207 The 3n + 1 problem

    1.链接地址: http://bailian.openjudge.cn/practice/1207/ http://poj.org/problem?id=1207 2.题目: 总时间限制: 1000m ...

  8. mysql主配置文件my.cnf详细说明

    MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记用[转载]#BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大 ...

  9. Mac 系统下安装 MySql

    Mac原生没有带MySql,想要使用需要自己去安装. 下载. 首先去mysql官网下载安装包. 由于现在mysql对企业有服务,所以有所谓社区版(community)和企业版(enterprise), ...

  10. 我爱工程化 之 gulp 使用(二)

    上一篇  介绍了gulp的安装.环境等配置.基本使用,那么现在,我们快走进 速8,深入了解吧...... 一.各种安装.环境配置.插件安装(参考上一篇文章) 二.项目基本目录结构 三.编写 gulpf ...