小编典典

尼克·约翰逊是正确的,一个一个O(n)的时间复杂度算法是最好的,如果你没有父指针,你可以做。)对于算法的一个简单的递归版本中看到代码金丁的职务)它运行在O(n)的时间。

但是请记住,如果您的节点具有父指针,则可以使用改进的算法。对于有问题的两个节点,请从节点开始并在前面插入父节点,以构建一个包含从根到节点的路径的列表。

因此,对于您的示例中的8,您得到了(显示步骤):{4},{2、4},{1、2、4}

对您所讨论的其他节点执行相同的操作,导致(未显示步骤):{1,2}

现在比较您创建的两个列表,以查找列表不同的第一个元素,或列表中一个的最后一个元素,以先到者为准。

该算法需要O(h)时间,其中h是树的高度。在最坏的情况下,O(h)等于O(n),但是如果树是平衡的,则只有O(log(n))。它还需要O(h)空间。可能只使用恒定空间的改进版本,代码在CEGRD的帖子中显示

不管如何构造树,如果这是您对树执行多次操作而又不改变树之间的操作,则可以使用其他算法,这些算法需要O(n)[线性]时间准备,但是要找到配对仅需O(1)[恒定]时间。有关这些算法的参考,请参见[Wikipedia上最低的祖先问题页面。(感谢Jason最初发布了此链接)

2020-07-28

树如何找共同祖先_如何找到任何二叉树中两个节点的最低公共祖先?相关推荐

  1. 程序员面试100题之十六:二叉树中两个节点的最近公共父节点(最低的二叉树共同祖先)

    这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个 ...

  2. 寻找二叉树中两个结点的最近公共祖先

    寻找二叉树中两个结点的最近公共祖先(这两个结点一定在树中) 对于二叉树中两个结点的最近公共祖先来说 ,这两个结点分别在自己的左子树和右子树中,所以要寻找二叉树中两个结点的最近公共祖先可以: 从根结点开 ...

  3. 二叉树——求两个节点的最近公共祖先

    题目 给定一颗二叉树的头结点,和这颗二叉树中2个节点n1和n2,求这两个节点的最近公共祖先: 思路 利用后序遍历实现: 对于当前节点cur,如果节点为null或者等于n1或n2中的一个,则直接返回cu ...

  4. 二叉树中两个节点的第一个祖先父节点

    分三种情况 1. 非二叉查找树,树root节点未知,节点包含父节点信息 2. 非二叉查找树,树root节点已知,节点不包含父节点信息 3. 二叉查找树,树root节点已知,节点不包含父节点信息 [Re ...

  5. 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现

    最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答. 题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么 ...

  6. 二叉树(二):判断是不是二叉搜索树、判断是不是完全二叉树、判断是不是平衡二叉树、二叉搜索树的最近公共祖先、在二叉搜索树中找到两个节点的最近公共祖先、序列化二叉树、重建二叉树、输出二叉树的右视图

    目录 一.判断是不是二叉搜索树 1.1 题目 1.2 题解 二.判断是不是完全二叉树 2.1 题目 2.2 题解 三.判断是不是平衡二叉树 3.1 题目 3.2 题解 四.二叉搜索树的最近公共祖先 4 ...

  7. 牛客题霸 [ 在二叉树中找到两个节点的最近公共祖先] C++题解/答案

    牛客题霸 [ 在二叉树中找到两个节点的最近公共祖先] C++题解/答案 题目描述 给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 题解: 我们想想最 ...

  8. 在二叉树中找到两个节点的最近公共祖先(C++)

    在二叉树中找到两个节点的最近公共祖先 描述   给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 数据范围:树上节点数满足1 ...

  9. 50:树中两个结点的最低公共祖先

    题目:求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针. 树的结点定义 private static class TreeNode {int val;List<TreeNo ...

最新文章

  1. 计算机为什么找不到c盘d盘,电脑不显示是什么盘?是C盘还是D盘?怎么才能显示出来呢?...
  2. 用Go语言建立一个简单的区块链part3:持久化和命令行接口
  3. Wireshark的入门使用
  4. 8.Java有关变量的面试题
  5. poj 1250 解题(链表法)
  6. springboot开启debug日志_SpringBoot 如何优雅的打印日志?
  7. 【Python】自动化升级所有pip安装的包
  8. gp3688写频线制作_摩托罗拉GP3688写频软件
  9. Python爬虫系列:判断目标网页编码的几种方法
  10. caffe运行问题(持续更新),sublime设置
  11. win10禁用计算机维护,win10哪些服务可以禁用 服务哪些可以禁止启动
  12. lvs keepalive配置Jenkins2高可用
  13. 拓端tecdat|拟合R语言中的多项式回归
  14. 二级计算机vfp知识,全国计算机vfp二级考试
  15. 数学建模基本模型(一) 优化模型
  16. centos7 vi保存退出_vi保存退出命令 - 卡饭网
  17. Python 创作音乐: 计算机创作,计算音乐
  18. android安全静态分析,[分享]发几个Android静态和动态分析的小技巧
  19. 转 为什么数码相机可以拍出彩色照片?
  20. 用Windows自带的系统恢复环境WinRE进行系统重大故障排查,轻松修复Windows蓝屏、白屏等问题

热门文章

  1. python中hasattr()、getattr()、setattr()函数的使用
  2. Python骚操作:动态定义函数
  3. 服务器操作系统文件共享设置,服务器操作系统文件共享设置
  4. 局域网延时大怎么办?
  5. c语言fgetc()函数(从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动)
  6. C语言 (条件编译#ifdef、#ifndef) (#if 常量,#if 1,#if 0)的用法
  7. web前端入门学习 css(7)css高级技巧 (精灵图、字体图标、css三角、鼠标样式、表单轮廓线、文本框拖拽、垂直对齐、图底空白缝隙、margin负值、溢出文字省略号、文字环绕、css初始化)
  8. numpy np.polyfit()(最小二乘多项式拟合曲线)(有待进一步研究)
  9. springboot中使用RedisTemplate操作redis遇到的问题
  10. SpringBoot操作Redis哈希类型