首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python算法——最近公共祖先

Python中的最近公共祖先(Lowest Common Ancestor,LCA)算法详解 最近公共祖先(Lowest Common Ancestor,LCA)是二叉树中两个节点的最低共同祖先节点。...最近公共祖先问题 给定一个二叉树和两个节点p、q,找到这两个节点的最近公共祖先。 递归算法求解最近公共祖先 递归算法是求解最近公共祖先问题的一种常见方法。...: 3 / 5 1 / \ / 6 2 0 8 / 7 4 # 构建二叉树 root = TreeNode(3) root.left = TreeNode(5) root.right =...{} 的最近公共祖先是节点 {}".format(p.val, q.val, lca.val)) 输出结果: 节点 5 和节点 1 的最近公共祖先是节点 3 这表示在给定的二叉树中,节点5和节点1的最近公共祖先是节点...递归算法在解决最近公共祖先问题时具有简洁而高效的特性。通过理解算法的原理和实现,您将能够更好地处理树结构问题。

29510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    LeetCode笔记:235. Lowest Common Ancestor of a Binary Search Tree

    大意: 给出一个二叉查找树(BST),在其中找到给出的两个节点的最低的共同祖先(LCA)。...根据维基百科对LCA的定义:“最低共同祖先是指两个节点v和w在T中有v和w作为后代节点的最低节点(我们允许节点是自己的祖先)。” image.png 比如说,2和8的LCA是6。...另一个例子,2和4的LCA是2,因为根据LCA的定义,一个节点可以是它自己的祖先。...思路: 这里要注意的地方是给出的二叉树是一个二叉查找树,所谓二叉查找树是指: 若左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若右子树不空,则右子树上所有结点的值均大于它的根结点的值; 左、...对于这个问题,如果是一个随意的二叉树要找LCA是比较麻烦的,要先找到目标节点的位置然后又反过来一层层找最低祖先。但是对于二叉查找树就要简单的多了,因为是排好序了的,可以简单地找到位置。

    23310

    二叉树的简单实战 → 一起温故下二叉树的遍历

    这个就交给你们自己去实现了   路径总和 LeeCode 113   给定二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径(...严格来时,是满二叉树的中序遍历)   很简单,直接看代码   这题很容易,只要你去实操折纸,找到了规律,代码实现就是手到擒来   最低公共祖先   求同一棵二叉树中两个节点的最低公共祖先节点   什么是最低公共祖先...,节点往上向根节点移动,两个节点最先汇聚的节点则是这两个节点的最低公共祖先,例如   10 和 4 的最低公共祖先就是 3   简单的做法是借助哈希表   先遍历一次二叉树,记录所有节点的父节点(HashMap...),然后找出其中某个节点(n1)的所有祖先节点(存放到 HashSet 中)   再从另一个节点(n2)开始,从 HashMap 中逐个找 n2 的祖先节点的同时,判断 n2 的当前祖先节点是否在 HashSet...中   一旦找到,这直接返回该节点,就是 n1 与 n2 的最低公共祖先   我们来看代码   很好理解,也很好实现,就是有点费空间   还有一种方式,实现非常简单,但却不好理解,是前辈们反复提炼之后得到的一种解法

    28320

    【数据结构】【算法】二叉树、二叉排序树、树的相关操作

    这个代码与之前的先序遍历非常类似。相当于重写了先序遍历中的visit()函数。 二叉排序树的最低公共祖先 ---- 已知存在一棵二叉排序树,其中保存的节点值均为正整数。...该函数的返回值是最低公共祖先节点的值。 上图中,若value1=5,value2=9,那么它们的最低公共祖先是节点8。...这个规律是由二叉排序树的基本特性决定的。 在二叉排序树中,如果两个节点分别位于根节点的左子树和右子树,那么这个根节点必然是它们的最低公共祖先。...而其他的公共祖先的值要么同时大于这两个节点的值,要么同时小于这两个节点的值。 如上图,5和9的最低公共祖先为8。...因为A的父节点一定是B的祖先,同时该节点必然是A和B的最低公共祖先。 如上图,3和8的最低公共祖先为10。

    51330

    【LeetCode100】--- 二叉树的最近公共祖先

    接着不过是去 当前节点的左边,当前节点的右边。去寻找 p 和 q 最近公共祖先的返回情况分三种 第一种 ① p 或 q 就是当前节点root。...直接返回 root 当前节点root == null 或者 root == p 或者 root == q 此时二叉树的最近公共祖先就是root 第二种: ② p 和 q都在当前节点的左边,那就递归去左边找...第三种: ③ p 和 q都在当前节点的右边。那就递归去右边找。 第四种: ④ p 和 q 在当前节点的两边,那么当前节点就是最近公共祖先。...通过对比这两条路径,找到它们的第一个共同节点,这个节点就是最低公共祖先。 这是一种 路径追踪 的方法,适用于寻找树中两个节点的最低公共祖先。...空间复杂度:O(h),由于递归和栈的使用。

    7510

    求二叉树两结点最近的共同祖先结点

    求二叉树两结点最近的共同祖先结点 题目要求及思路分析 题目要求:已知在二叉树中,* root 为根结点,* p和* q为二叉树中两个结点,试编写求距离它们最近的共同祖先的算法。...—《数据结构习题集(C语言版)》 思路: 显然在这个题目中,递归遍历不适用。同时先中后三种顺序,先序遍历比较合适。 要利用栈的特性来存储访问目标结点的路径,以便于最后查找它的祖先结点。...当* p和* q的路径都找到后,我们可以看到根结点在栈底,而目标结点在栈顶,这样的话不利于我们比较两条路径上共同的祖先结点。...----*/ 4.利用栈来存储访问目标结点的路径 /*求距两个子结点最近的共同祖先结点*/ Status FindPath(BiTree root, BiTree target, SqStack...对* p、* q分别调用第4步中的函数,将得到的两个路径栈逆置,在逆置后的栈中出栈顶元素同时进行比较,得到公共祖先结点 Status CommentParent(BiTree* parent, BiTree

    1.5K21

    LeetCode 236:二叉树的最近公共祖先

    这是无量测试之道的第216篇原创 特别说明: 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出:5 解释:节点 5 和节点 4 的最近公共祖先是节点...因为根据定义最近公共祖先节点可以为节点本身。 ---- 解题思路:   一般二叉树相关的算法题,都可以使用递归这个编程技巧来解题,本题也不例外。...分析: 2个节点存在的位置,不外乎以下4种情况: 要么都在左子树上 要么都在右子树上 要么一个在左,一个在右 至少有一个不在这颗二叉树中【就是不在这个二叉树上的情况】 我们先看代码,然后来讲解解法...先从左子树上找共同的祖先,记为left    2....再从右子树上找共同的祖先,记为right    如果left和right都不为nil,说明满足上述的条件3【一个在左,一个在右】,所以很显然,祖先节点就是根节点root;    如果left不为nil

    30710

    二叉树的最近公共祖先 II

    题目 给定一棵二叉树的根节点 root,返回给定节点 p 和 q 的最近公共祖先(LCA)节点。 如果 p 或 q 之一不存在于该二叉树中,返回 null。 树中的每个节点值都是互不相同的。...根据维基百科中对最近公共祖先节点的定义:“两个节点 p 和 q 在二叉树 T 中的最近公共祖先节点是后代节点中既包括 p 又包括 q 的最深节点(我们允许一个节点为自身的一个后代节点)”。...示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和 1 的共同祖先节点是 3。...示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和 4 的共同祖先节点是 5。...根据共同祖先节点的定义,一个节点可以是自身的后代节点。

    41450

    2022-03-19:已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回

    2022-03-19:已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回数组里所有值的最低公共祖先。...1} root.left = &TreeNode{val: 2} root.right = &TreeNode{val: 3} root.left.left = &TreeNode{val: 4}...root.left.right = &TreeNode{val: 5} root.right.left = &TreeNode{val: 6} root.right.right = &TreeNode...set[node.val] = struct{}{} } return process(root, set, len(set)).find } type Info struct { // 找没找到最低公共祖先...// 没找到,find = null // 找到了最低公共祖先,find是最低公共祖先 find *TreeNode // 我这颗子树上,删掉了几个节点!

    49310

    六大类二叉树面试题汇总解答

    查找类问题 查找类问题主要包括:查找二叉树/二叉搜索树的最低公共祖先结点,或者是二叉树中的最大的子树且该子树为二叉搜索树等。...4.1 二叉搜索树最低公共祖先结点 题:给定一棵二叉搜索树(BST),找出树中两个结点的最低公共祖先结点(LCA)。...(不一定是BST)最低公共祖先结点 题:给定二叉树中的两个结点,输出这两个结点的最低公共祖先结点(LCA)。...如果左子树包含两个结点,则它们的最低公共祖先结点也一定在左子树中。 如果右子树包含两个结点,则它们的最低公共祖先结点也一定在右子树中。...(8, 5) = 5 解:两个结点的距离比较好办,先求出两个结点的最低公共祖先结点(LCA),然后计算 LCA 到两个结点的距离之和即可,时间复杂度 O(N) 。

    22910

    二叉树两个节点的最低公共最先问题

    new Node(4); Node t5=new Node(5); Node t6=new Node(6); Node t7=new Node(7); t1.left=t2;...,两个节点的最低公共祖先,最低公共祖先意思是从下往上两个节点遇到的第一个祖先。...解决这个问题的思路有两种: 1.从根节点往下寻找,如果发现两个节点分别在左右子树上那么就找到了最低公共祖先,这是一个思路,但是这种算法实现起来复杂度比较高,所以放弃,选择第二种思路 2.第二种思路是,两个节点...,分别找到,从根节点到这两个节点的路径,找到路径后问题就转变为求两个链表的交叉点,这样就好做多了,就是从根节点按照路径往下遍历,如果果首次发现两个链表的节点不是同一个节点了,那么两个链表上一个公共节点就是最低祖先...,首先得问题就是怎么找到路径,我解决这个问题的方法是回溯法,新建一个类,这个类的成员变量有二叉树的节点,两个布尔型变量,代表左右子树是否被遍历过,false为没有遍历,true为已经遍历过了,还有一个变量就存放着走向

    19720

    二叉树操作详解

    ; 求两个结点的最低公共祖先结点; 求任意两结点距离; 找出二叉树中某个结点的所有祖先结点; 不使用递归和栈遍历二叉树; 二叉树前序中序推后序; 判断二叉树是不是完全二叉树; 判断是否是二叉查找树的后序遍历结果...结点 3 和结点 4 的最近公共祖先是结点 2,即 LCA(3,4)=2。在此,需要注意到当两个结点在同一棵子树上的情况,如结点 3 和结点 2 的最近公共祖先为 2,即 LCA(3,2)=2。...如果给定结点 5,则其所有祖先结点为 4,2,1。...13 二叉树前序中序推后序 方式 序列 前序 [1 2 4 7 3 5 8 9 6] 中序 [4 7 2 1 8 5 9 3 6] 后序 [7 4 2 8 9 5 6 3 1] 以上面图表为例,步骤如下...: 根据前序可知根结点为1; 根据中序可知 4 7 2 为根结点 1 的左子树和 8 5 9 3 6 为根结点 1 的右子树; 递归实现,把 4 7 2 当做新的一棵树和 8 5 9 3 6 也当做新的一棵树

    75920

    python技术面试题(二十一)

    正文共:837 字 5 图 预计阅读时间:3 分钟 ? 每日分享 If you want to awaken all of humanity, awaken all of yourself....翻译简单,意译难,没有具体的上下文,还是不翻译此句了。 ? 排序二叉树如何查找两个叶节点的最近公共祖先 排序二叉树有一个特点,就是左子树的节点都比父节点小,位于右子树的节点都比父节点大。...抓住这个特点,我们从根节点开始进行比较查找。如果当前节点的值比两个节点的值都大,那么最低的公共祖先节点一定在该节点的左子树中,下一步就开始遍历当前节点的左子树。...如果当前节点的值比两个节点的值都小,那么最低的公共祖先节点一定在该节点的右子树中,下一步就是遍历当前节点的右子树。这样从上到下找到第一个在两个输入节点的值之间的节点。...框架中的英文单词 Django中数据库的相关操作 DRF框架中的英文单词 DRF框架 Django相关知识点回顾 python技术面试题-腾讯

    60120

    二叉树OJ题(C++实现)

    二叉树的最近公共祖先 二叉树的最近公共祖先 ---- ---- 共分为三种情况 第一种情况 寻找节点7与0的公共祖先为 根节点3 节点7在根的左子树,而节点0在根的右子树 若一个在根的左子树,一个在根的右子树..., 则根就为公共祖先 ---- 第二种情况 以左子树为例 节点7与节点4属于根的左子树 节点7与节点4的最近公共祖先为 他们共同的父节点2 ---- 若两个节点都在根的左子树,则递归根的左子树的节点为根...,判断两个节点是否为根的左右子树,直到寻找到 ---- 第三种情况 节点5与节点4的最近公共祖先是节点5 节点5与节点4都属于根的左子树 若两个节点都在根的左子树,则递归根的左子树的节点为根,当这个根为两个节点其中一个时...,则这个节点就为公共祖先 ---- 由于第二种和第三种情况,节点都在左子树上,所以可以看作是一种情况 ---- class Solution { public: bool istree(TreeNode...) { head=head->left; } return head; } }; ---- 4.从前序与中序遍历序列构造二叉树 ---- 从前序与中序遍历序列构造二叉树 ---

    18720

    二叉树子节点的最近父节点

    查找二叉树子节点的最近共同父节点 分析 实现 算法复杂度 其他算法 题目升级 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。...百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”...实例1 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 输出: 6 解释: 节点 2 和节点 8 的最近公共祖先是 6。...实例2 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 输出: 2 解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身...说明: 所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉搜索树中。

    1.8K40

    How to find the lowest common ancestor in a tree 最近公共祖先

    [题目] 求二叉树的任意两个节点的最近公共祖先。 此题有多个扩展问题: 如果只查询一次,二叉树给出向上(parent)链接和不给向上链接时分别有什么解法,最佳空间时间复杂度是多少?...如果一次性给出多组查询,解法能有什么改进,空间时间复杂度又是什么?...5 6 对于左侧二叉树, 节点 4 , 5的最近公共祖先是2,节点5,6的最近公共祖先是1 [澄清] 在面试中,面试者一般不直接告诉你树是否有向上链接,能否自定义树的node,而这类信息对此题的解法复杂度又有相当重要的影响...最后将p1 和 p2 同时向上走直到他们相遇。显然,此次相遇是他们第一次相遇,而相遇时所在的节点也就是最近公共的祖先节点。 如果没有向上链接,我们只能通过遍历树的方法来的到最近公共祖先。...可以证明,在一棵树中,最近公共祖先必然是1)p1,p2节点中的一个,或者2)p1,p2分别在其左右子树中。通过后序遍历整棵树,分别判断如上的条件即可得到结果。

    63140

    (42) 排序二叉树 计算机程序的思维逻辑

    40节介绍了HashMap,41节介绍了HashSet,它们的共同实现机制是哈希表,一个共同的限制是没有顺序,我们提到,它们都有一个能保持顺序的对应类TreeMap和TreeSet,这两个类的共同实现基础是排序二叉树...比如说左边的树,根节点为5,左边的都小于5,右边的都大于5。再看右边的树,根节点为7,左边的都小于7,右边的都大于7,在以3为根的左子树中,其右子树的值都大于3。 排序二叉树有什么优点?...比如说,在下图中,左边二叉树中删除节点4,就是让4的父节点3与4的孩子节点6直接建立链接。 ?...平衡的排序二叉树 从前面的描述中可以看出,排序二叉树的形状与插入和删除的顺序密切相关,极端情况下,排序二叉树可能退化为一个链表,比如说,如果插入顺序为:1 3 4 6 7 8 9,则排序二叉树形状为:...满足这个平衡定义的排序二叉树又被称为AVL树,这个名字源于它的发明者G.M. Adelson-Velsky 和 E.M.

    73660
    领券