树如何找共同祖先_如何找到任何二叉树中两个节点的最低公共祖先?
小编典典
尼克·约翰逊是正确的,一个一个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
树如何找共同祖先_如何找到任何二叉树中两个节点的最低公共祖先?相关推荐
- 程序员面试100题之十六:二叉树中两个节点的最近公共父节点(最低的二叉树共同祖先)
这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个 ...
- 寻找二叉树中两个结点的最近公共祖先
寻找二叉树中两个结点的最近公共祖先(这两个结点一定在树中) 对于二叉树中两个结点的最近公共祖先来说 ,这两个结点分别在自己的左子树和右子树中,所以要寻找二叉树中两个结点的最近公共祖先可以: 从根结点开 ...
- 二叉树——求两个节点的最近公共祖先
题目 给定一颗二叉树的头结点,和这颗二叉树中2个节点n1和n2,求这两个节点的最近公共祖先: 思路 利用后序遍历实现: 对于当前节点cur,如果节点为null或者等于n1或n2中的一个,则直接返回cu ...
- 二叉树中两个节点的第一个祖先父节点
分三种情况 1. 非二叉查找树,树root节点未知,节点包含父节点信息 2. 非二叉查找树,树root节点已知,节点不包含父节点信息 3. 二叉查找树,树root节点已知,节点不包含父节点信息 [Re ...
- 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现
最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答. 题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么 ...
- 二叉树(二):判断是不是二叉搜索树、判断是不是完全二叉树、判断是不是平衡二叉树、二叉搜索树的最近公共祖先、在二叉搜索树中找到两个节点的最近公共祖先、序列化二叉树、重建二叉树、输出二叉树的右视图
目录 一.判断是不是二叉搜索树 1.1 题目 1.2 题解 二.判断是不是完全二叉树 2.1 题目 2.2 题解 三.判断是不是平衡二叉树 3.1 题目 3.2 题解 四.二叉搜索树的最近公共祖先 4 ...
- 牛客题霸 [ 在二叉树中找到两个节点的最近公共祖先] C++题解/答案
牛客题霸 [ 在二叉树中找到两个节点的最近公共祖先] C++题解/答案 题目描述 给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 题解: 我们想想最 ...
- 在二叉树中找到两个节点的最近公共祖先(C++)
在二叉树中找到两个节点的最近公共祖先 描述 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 数据范围:树上节点数满足1 ...
- 50:树中两个结点的最低公共祖先
题目:求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针. 树的结点定义 private static class TreeNode {int val;List<TreeNo ...
最新文章
- 计算机为什么找不到c盘d盘,电脑不显示是什么盘?是C盘还是D盘?怎么才能显示出来呢?...
- 用Go语言建立一个简单的区块链part3:持久化和命令行接口
- Wireshark的入门使用
- 8.Java有关变量的面试题
- poj 1250 解题(链表法)
- springboot开启debug日志_SpringBoot 如何优雅的打印日志?
- 【Python】自动化升级所有pip安装的包
- gp3688写频线制作_摩托罗拉GP3688写频软件
- Python爬虫系列:判断目标网页编码的几种方法
- caffe运行问题(持续更新),sublime设置
- win10禁用计算机维护,win10哪些服务可以禁用 服务哪些可以禁止启动
- lvs keepalive配置Jenkins2高可用
- 拓端tecdat|拟合R语言中的多项式回归
- 二级计算机vfp知识,全国计算机vfp二级考试
- 数学建模基本模型(一) 优化模型
- centos7 vi保存退出_vi保存退出命令 - 卡饭网
- Python 创作音乐: 计算机创作,计算音乐
- android安全静态分析,[分享]发几个Android静态和动态分析的小技巧
- 转 为什么数码相机可以拍出彩色照片?
- 用Windows自带的系统恢复环境WinRE进行系统重大故障排查,轻松修复Windows蓝屏、白屏等问题
热门文章
- python中hasattr()、getattr()、setattr()函数的使用
- Python骚操作:动态定义函数
- 服务器操作系统文件共享设置,服务器操作系统文件共享设置
- 局域网延时大怎么办?
- c语言fgetc()函数(从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动)
- C语言 (条件编译#ifdef、#ifndef) (#if 常量,#if 1,#if 0)的用法
- web前端入门学习 css(7)css高级技巧 (精灵图、字体图标、css三角、鼠标样式、表单轮廓线、文本框拖拽、垂直对齐、图底空白缝隙、margin负值、溢出文字省略号、文字环绕、css初始化)
- numpy np.polyfit()(最小二乘多项式拟合曲线)(有待进一步研究)
- springboot中使用RedisTemplate操作redis遇到的问题
- SpringBoot操作Redis哈希类型