`
lovnet
  • 浏览: 6709865 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

寻找二叉树两节点的最近的公共祖先[转载+整理]

 
阅读更多

1.树节点定义中带有parent指针

算法思想:

(1).p->parent

(2).将q的所有祖先节点依次和p->parent作比较,如果发现两个节点相等,则该节点就是最近公共祖先,直接将其返回。如果没找到相等节点,则转3

(3).p=p->parent,转2

主要代码如下:

时间复杂度:假设p,q的公共父节点为cur,p到cur的路径长度为LP,q到cur的路径长度LQ,则时间复杂度为O(LP*LQ).空间复杂度O(1).

另外一种可能会降低时间复杂度的方法:

算法思想:

(1).从root到p简历一条链表list1,从root到q简历一条链表list2

(2).问题转为为求list1和list2的最后一个相同的节点

主要代码如下

时间复杂度分析:假设p节点到根节点的路径长度为L1,假设q节点到根节点的路径长度为L2,则算法的时间复杂度为O(L1+L2),空间复杂度小于O(L1+L2).

2.树节点定义中不带有parent指针

主要思想:节点cur的左子树包含一个节点(p或者q),右子树包含另一个节点(p或者q),则cur就是我们要找的节点。

时间复杂度分析:设书中节点的数目为N(遍历所有的树节点),则时间复杂度为O(N),空间复杂度O(1)


再加上一个老外的实现:

Given the values of two nodes in a *binary search tree*, write a c program to find the lowest common ancestor. You may assume that both values already exist in the tree.

The function prototype is as follows:

 int FindLowestCommonAncestor(node* root, int value1, int value)

  I/P : 4 and 14
  O/P : 8
  (Here the common ancestors of 4 and 14, are {8,20}.
  Of {8,20}, the lowest one is 8).

Here is the solution

Algorithm:
The main idea of the solution is — While traversing Binary Search Tree from top to bottom, the first node n we encounter with value between n1 and n2, i.e., n1 < n < n2 is the Lowest or Least Common Ancestor(LCA) of n1 and n2 (where n1 < n2). So just traverse the BST in pre-order, if you find a node with value in between n1 and n2 then n is the LCA, if it's value is greater than both n1 and n2 then our LCA lies on left side of the node, if it's value is smaller than both n1 and n2 then LCA lies on right side.

Implementation:

Note that above function assumes that n1 is smaller than n2.

Time complexity:Time complexity is O(Logn) for a balanced BST and O(n) for a skewed BST.

The question was asked by Varun Bhatia


好像发现上面的实现都是假设二叉树左子节点小于根节点,右子树节点大于根节点,假如我的数不是那样存储的,貌似就没有用咯。。

分享到:
评论

相关推荐

    寻找二叉树两结点最近的祖先

    (1)拟定合适的二叉树的输入形式和构造算法; (2)能够以直观的形式观察所建立的二叉树的结构;

    二叉树中最低公共祖先

    本程序为VS2010编写,其中包含两种方法实现此题目。

    面试题68 – II. 二叉树的最近公共祖先

    给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点...

    二叉树的最近公共祖先II1

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节

    使用C语言求二叉树结点的最低公共祖先的方法

    主要介绍了使用C语言求二叉树结点的最低公共祖先的方法,文中还给出了ACM的练习题目,需要的朋友可以参考下

    floatLig#JavaLearning#236.二叉树的最近公共祖先1

    中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以

    Easay#JavascriptCoding#剑指68-2.二叉树的最近公共祖先1

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节

    Cygra#Leet-Code-Solus#0236. 二叉树的最近公共祖先1

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节

    DoWalle#algo#2096-[最近公共祖先]-从二叉树一个节点到另一个节点每一步的方向1

    剩下即为从起点和终点的最近公共祖先出发,到起点和终点的路径我们要找的最短路径即为:起点 =&gt; 起点和终点的最近公共祖先 =&gt; 终点。答案为:起点 =&gt; 公共祖先

    LeetCode 1123. 最深叶节点的最近公共祖先(递归比较子树高度)

    给你一个有根节点的二叉树,找到它最深的叶节点的最近公共祖先。 回想一下: 叶节点 是二叉树中没有子节点的节点 树的根节点的 深度 为 0,如果某一节点的深度为 d,那它的子节点的深度就是 d+1 如果我们假定 A 是一...

    二叉树节点ADT接口(Java算法源码)

    * 二叉树节点ADT接口 */ package dsa; public interface BinTreePosition extends Position { //判断是否有父亲(为使代码描述简洁) public boolean hasParent(); //返回当前节点的父节点 public ...

    基于链表节点实现二叉树节点(Java源码)

    * 基于链表节点实现二叉树节点 */ package dsa; public class BinTreeNode implements BinTreePosition { protected Object element;//该节点中存放的对象 protected BinTreePosition parent;//父亲 ...

    二叉树的相关操作

    本程序包括二叉树的一些常见的相关操作,比如非递归建立二叉树,二叉树的非递归遍历,非递归求二叉树的叶子数目,层数,任意两个节点的公共祖先,跟到叶子节点的所有路径,根据中序和后序的遍历结果建立二叉树等等。

    二叉树的各种操作源代码c++

    //求二叉树的节点个数//前序打印叶子节点//二叉树的遍历//求二叉树的第k层节点的值//交换二叉树的左右子树//求二叉树中两个节点的最低公共祖先节点//求双亲节点//判断两棵二叉树是否相同//二叉树删除节点//二叉树...

    二叉树的建立及遍历

    如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一棵二叉树。试编写实现上述功能的程序。 [基本要求] 已知一棵二叉树的前序和中序序列,试设计完成下列任务的一个算法: (1)构造一棵二叉树...

    第五章 树与二叉树

    由于二叉树中每个结点都可能有两个子树,因此需要寻找一条合适的搜索路径。 1、前序遍历 前序遍历二叉树操作定义为: 若树为空,则空操作返回;否则 (1)访问根结点 (2)前序遍历根结点的左子树 (3)前序遍历根...

    树的公共父节点.rar

    因为树的结构不同所以需要分情况...当树为二叉排序树,寻找给定两节点的最低公共祖先 当树为普通树,每个节点中有指针指向其父节点 当树为二叉树,每个节点仅有左右孩子指针 当树为普通树,每个节点仅有左右孩子指针

    二叉树实现(C++版本)

    除此,还有find方法可以查找一个节点并返回其父节点和祖先节点;swapTree方法可以交换二叉树的左右子树。原创,后续还会推出二叉树的Qt版本,可以图形化显示二叉树,喜欢的朋友可以关注我哦(^_^)如有任何问题请私...

    遍历二叉树:如何高效列出所有祖先结点.zip

    列出所有祖先结点在本文中,我们详细介绍了如何在二叉树中列出指定节点的所有祖先节点。我们提供了迭代和递归两种实现方式,并讨论了优化、扩展和实际应用等方面的内容。通过掌握这些概念和技巧,我们可以更好地理解...

Global site tag (gtag.js) - Google Analytics