3.19 Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题

题目】:

  如下的Node类是标准的二叉树节点结构:

1 public class Node{
2         public int value;
3         public Node left;
4         public Node right;
5
6         public Node(int data){
7                 this.value = data;
8         }
9 }

  再定义Query类如下:

1 public class Query{
2         public Node o1;
3         public Node o2;
4
5         public Query(Node o1, Node o2){
6                 this.o1 = o1;
7                 this.o2 = o2;
8         }
9 }

  一个Query类的实例表示一条查询语句,表示想要查询o1节点和o2节点的最近公共祖先节点

  给定一棵二叉树的头节点head,并给定所有的查询语句,即一个Query类型的数组Query[] ques,请返回Node类型的数组Node[] ans,ans[i]代表ques[i]这条查询的答案,即ques[i].o1和ques[i].o2的最近公共祖先

要求】:

  如果二叉树的节点数为N,查询语句的条数为M,整个处理过程的时间复杂度要求达到O(N+M)

题目来源:左程云老师《程序员代码面试指南》

原文地址:https://www.cnblogs.com/latup/p/10204914.html

时间: 2024-11-06 16:20:02

3.19 Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题的相关文章

线段树、最短路径、最小生成树、并查集、二分图匹配、最近公共祖先--C++模板

线段树(区间修改,区间和): #include <cstdio> #include <iostream> #include <cstring> using namespace std; int c[1000000],n,m; char s; void update(int p,int l,int r,int x,int add) { int m=(l+r) / 2; if (l==r) { c[p]+=add; return; } if (x<=m) update

(hdu step 5.1.5)Dragon Balls(求并查集的根节点、节点数和个结点的移动次数)

题目: Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 562 Accepted Submission(s): 239   Problem Description Five hundred years later, the number of dragon balls will increase unexpected

并查集-解决区间和纠错问题 hdu-3038

题目:多次给出信息,告诉你[a,b]区间的和,求多少个错误信息(错误信息不考虑). 乍一看有点像线段树,但想想就发现这个并不能用线段树方便地解决.后来经提醒是并查集的一种经典题型. 把区间抽象为并查集的子节点和母根结点,子节点存放了到根节点的区间和.这样当引入一个新的区间,如果区间左右界根节点不同就一定不存在矛盾(有点种类并查集的意思,形象来看就是存在冗余区间用于调整),然后可以通过现存集合推导出子节点到根节点的区间和.如果根节点相同则要判断一下是否矛盾(画个图对线段加加减减就能推出公式了,文字

算法模板——并查集 2(支持快速即时查询本连通块内容,纯原创!)

实现功能:输入N,现在有N个数:接下来输入任意行,如果是"1 x y"则表示把x和y所在的块合并:如果是"2 x"则表示输出x所在的块的全部内容 原理:其实主要是自己创造了一个可并链line,he表示链头,ta表示链尾,然后对于不同块之间的合并就是直接把两条链对接,也就是一个的尾巴接到另一个的头上,构成新链(由于是链的直接叠加,所以可以做到严格的O(1),并且输出时输出多少复杂度就是多少,完全不存在额外复杂度).然后同时用原本的普通数组并查集进行维护和追踪(理论值为

POJ 2762 tarjan缩点+并查集+度数

Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15494   Accepted: 4100 Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms, and one-way corridors

【数据结构与算法】并查集基础

1.介绍 并查集是一种树型数据结构,用于处理一些不相交集合的合并问题. 并查集主要操作有: (1)合并两个不相交集合: (2)判断两个元素是否属于同一个集合: (3)路径压缩: 2.常用操作 用father[i]表示元素i的父亲结点,例如: 用某个元素所在树的根节点表示该元素所在集合: 判断两个元素是否属于同一个集合的时候,只需要判断他们所在树的根节点是否一样即可: 也就是说,当我们合并两个集合的时候,只需要在两个根节点之间连边即可. 获取根节点代码: 1 int findFather(int

算法:并查集

并查集是一种用途广泛的数据结构,能够快速地处理集合的合并和查询问题,并且实现起来非常方便,在很多场合中都有着非常巧妙的应用,.本文首先介绍并查集的定义.原理及具体实现,然后以其在最小生成树算法中的一个经典应用为例讲解其具体使用方法. 一 并查集原理及实现 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题. 并查集在使用中通常以森林来表示,每个集合组织为一棵树,并且以树根节点为代表元素.实际中以一个数组father[x]即可实现,表示节点x的父亲节点.另外用一个变量n表示节点的个

(算法)并查集及其应用

题目: 某国家有N个小岛组成,经过多年的基础设施累积,若该岛屿之间建立若干桥梁,先重新完善该国的行政区划,规定只要有桥梁连接的岛屿则归属于同一个城市(可以通过其他岛屿中转),问该国可以划分为多少个城市? 思路: 并查集 代码: #include<iostream> #include<set> using namespace std; class UnionFindSet{ private: int m_nN; int* m_pParent; public: UnionFindSet

编程算法 - 食物链 并查集 代码(C)

食物链 并查集 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有N仅仅动物, 分别编号为1,2,...,N. 全部动物都属于A,B,C中的一种. 已知A吃B, B吃C, C吃A. 按顺序给出两种信息K条. 第一种: x和y属于同一类. 另外一种: x吃y.  信息之间可能会出错和矛盾, 求不对的信息数. 比如: 有N=10仅仅动物, 给定K=7条信息. (1) 1: x=101, y=1; 出错:没有101的动物. (2) 2: x=1,