#include
#include
using std::endl;
using std::vector;
using std::cin;
using std::cout;
struct treeNode
{
int value;
treeNode*left;
treeNode*right;
};
bool isAncestor(treeNode*root,treeNode*p)
{
if(...
分类:
其他好文 时间:
2015-05-13 16:48:34
阅读次数:
137
给出一棵二叉树和两个二叉树上的节点,求出这两个点的最近公共祖先(Lowest Common Ancestor, LCA)。...
分类:
编程语言 时间:
2015-05-13 10:28:54
阅读次数:
185
题目描述 这次是使用在线算法解决这个问题。 两个节点的最近公共祖先就是这两个节点的通路上深度最浅的那个节点。 可以通过一遍深搜把树转成数组:每次经过一个节点(无论是从父节点进入还是从子节点返回)时,把它放入数组。同时要记录每个节点在数组中最后一次出现的位置。 使用RMQ-ST算法预先计算2^k长度区...
分类:
其他好文 时间:
2015-05-09 23:18:38
阅读次数:
162
题目描述这次使用离线算法来解决最近公共祖先的问题。离线算法可以一遍 dfs 处理完所有的查询,因而需要把查询全部储存起来。具体的 dfs 过程是:所有节点最初标记为白色,第一次经过该节点时,将其染成灰色,第二次经过该节点时(即离开该节点时)将其染成黑色。在 dfs 的某个状态下,白色代表未访问的节点...
分类:
其他好文 时间:
2015-05-08 21:59:30
阅读次数:
119
题目描述由于这个跟后几周是一个系列,这周的做法比较简单。把第一个人的所有祖先做标记,第二个人向上查找祖先直到找到一个标记过的节点或无法继续为止。代码其实没什么意思。import java.util.HashMap;import java.util.Map;import java.util.Scann...
分类:
其他好文 时间:
2015-05-05 23:32:07
阅读次数:
189
找binary tree中两个node第一个公共祖先。注意不一定是BST想法:p,q都在左子树,就branch left。如果都在right,就branch right。如果不在same side,就返回first common ancestor所以主要是在left subtree和right su...
分类:
其他好文 时间:
2015-05-04 13:31:09
阅读次数:
155
Tarjan-LCA算法:
对于每一点u:
1.建立以u为代表元素的集合。
2.遍历与u相连的节点v,如果没有被访问过,对于v使用Tarjan-LCA算法,结束后,将v的集合并入u的集合。
3.对于与节点u相关的询问(u,v),如果v被访问过,则结果就是v所在集合的所代表的元素。求(u,v)的最近公共祖先节点,则询问时调用QEdges[k].lca = find(QEdges[k].to);...
分类:
其他好文 时间:
2015-05-04 11:57:14
阅读次数:
116
最近研究了一下最近公共祖先算法,根据效率和实现方式不同可以分为基本算法、在线算法和离线算法。下面将结合hihocoder上的题目分别讲解这三种算法。1、基本算法 对于最近公共祖先问题,最容易想到的算法就是从根开始遍历到两个查询的节点,然后记录下这两条路径,两条路径中距离根节点最远的节点就是所要...
分类:
编程语言 时间:
2015-05-03 00:39:52
阅读次数:
262
题目描述或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及。在这种情况下,最好的帮手就是计算机。为了将问题简化,...
分类:
其他好文 时间:
2015-05-01 22:24:05
阅读次数:
124