最近公共祖先 [TOC] 定义:给定一颗有根树,若结点 z 既是 x 的祖先,也是 y 的祖先,则称 z 是 x,y 的公共祖先。 在 x,y 所有的公共祖先中,深度最大的一个称为 x,y 的最近公共祖先,简称$LCA(x,y)$。 求解最近公共祖先一般有三种解法:向上标记法,树上倍增法和 Tarj ...
分类:
其他好文 时间:
2020-02-02 16:13:11
阅读次数:
118
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N?1 行每行包含两个正整数 x,y,表示 x 结点和 y 结点之间有一条直接连接的边(数据保证可以构成树)。 接下来 M ...
分类:
其他好文 时间:
2020-02-01 21:10:47
阅读次数:
74
主席树的综合运用题. 前置芝士 1. "可持久化线段树" :~~其实就是主席树了~~. 2. "LCA" :最近公共祖先,本题需要在$\log_2N$及以内的时间复杂度内解决这个问题. 具体做法 主席树维护每个点到根节点这一条链上不同树出现的次数,然后发现这个东西是可以相减的,于是这条链上每个数出现 ...
分类:
其他好文 时间:
2020-01-31 21:02:56
阅读次数:
94
其实敲树剖敲多了就会手敲,然后就发现其实树剖也是可以求LCA的,根据树剖的经验,我们两遍dfs后关于询问l,r的情况我们就开始跳链,当l,r处于同一个链的时候返回深度较小的那个点就好了,这里给个例题: 题目链接:http://poj.org/problem?id=1330 Description A ...
分类:
其他好文 时间:
2020-01-15 14:14:21
阅读次数:
95
LCA模板题,用倍增法去写 首先把每一个节点的向上$2^i (i \in \mathbb N)$个祖先给枚举出来 再把要求公共祖先的两个节点拉到同一深度 向上不断利用倍增一起跳跃同样层数到他们各自的非公共祖先的祖先节点 最后他们一起到达共同祖先节点的子节点,再同时向上走一位即可 在这个过程中,同时维 ...
分类:
其他好文 时间:
2019-12-29 13:26:49
阅读次数:
63
* @lc app=leetcode.cn id=236 lang=cpp * * [236] 二叉树的最近公共祖先 * * https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/description/ * ...
分类:
其他好文 时间:
2019-12-06 13:49:58
阅读次数:
88
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6, ...
分类:
其他好文 时间:
2019-12-02 20:43:24
阅读次数:
94
一道例题: 最近公共祖先 Description 给你一棵有根树,要求你计算出m对结点的最近公共祖先。 Input 输入文件的第一行包含两个整数n和m(2<=n,m<=200,000),其中n为结点个数,结点编号为1到n;m表示询问次数。 接下来n-1行,每行两个整数x和y,表示结点x是结点y的父亲 ...
分类:
其他好文 时间:
2019-11-27 19:14:03
阅读次数:
67
class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': if p.val>q.val: p,q=q,p if q.val<root.va ...
分类:
其他好文 时间:
2019-11-19 17:11:48
阅读次数:
93
题目链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/ 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表 ...
分类:
其他好文 时间:
2019-11-16 12:33:40
阅读次数:
88