社区
数据结构与算法
帖子详情
如何求二叉树2个节点的最近共同祖先节点?
icecools
2006-09-28 07:36:01
如下树,找出2个任意节点的最近的公共祖先节点
10
/ \
6 15
/ \ / \
3 8 12 18
/ / \
1 7 9
/
8.5
例如:1和7的最近公共祖先节点是6, 7和8.5的最近公共祖先是8,大家有什么好的算法或者思路吗?最好是O(N)的,谢谢!
...全文
1052
11
打赏
收藏
如何求二叉树2个节点的最近共同祖先节点?
如下树,找出2个任意节点的最近的公共祖先节点 10 / \ 6 15 / \ / \ 3 8 12 18 / / \ 1 7 9 / 8.5 例如:1和7的最近公共祖先节点是6, 7和8.5的最近公共祖先是8,大家有什么好的算法或者思路吗?最好是O(N)的,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dengsf
2006-09-29
打赏
举报
回复
LZ没保证树是平衡的,所以楼上的只对最理想情况才有效。
可考虑并查集。
weijiangshanwww
2006-09-29
打赏
举报
回复
找出2个任意节点的最近的公共祖先节点,而且还需要O(n)的算法。
一般来说就是牺牲空间换取时间。或者牺牲时间换取空间。
(个人观点)
1:牺牲空间换取时间。
在结点信息中增加成员变量。(深度值,和在该深度上的序号。即:从左往右第几位)
然后在寻找共同最近的祖先时候,可以按照成员变量的值,进行搜索。而且效率〈o(n)
2:牺牲时间换取空间。
不附加任何信息。
遍历一次。
从要求的结点开始。一直往上,记录下所有遍历的祖先结点。每往上走一次就把得到的两个结合求交。直到根结点结束。
fflush
2006-09-28
打赏
举报
回复
哦,误会了,这个节点里可以有个指针指向父节点
但是要全部取出来的话第一要动态申请数组,第二2个数组比较的时候还是O(N*N)的时间复杂度,不知道有没有什么好的算法可以快一点
-------------------------------------------
向上取出所有的祖先节点,这个只需要logn的空间,因此两边比较也只需要logn * logn的时间,这个比O(n)还要低,基本上不能更好了
icecools
2006-09-28
打赏
举报
回复
关键是2边不能一起上溯
icecools
2006-09-28
打赏
举报
回复
楼上这个方法不行,比如图示的3和8.5的结果应该是6,但是你求不出来的
Riemann
2006-09-28
打赏
举报
回复
O(N)的,代码大致如下:
nodetype* comm(nodetype* n1, nodetype* n2)
{
if (n1->parent == n2)
return n2
else if (n2->parent == n1)
return n1
else
return comm(n1->parent, n2->parent);
}
icecools
2006-09-28
打赏
举报
回复
哦,误会了,这个节点里可以有个指针指向父节点
但是要全部取出来的话第一要动态申请数组,第二2个数组比较的时候还是O(N*N)的时间复杂度,不知道有没有什么好的算法可以快一点
zzwu
2006-09-28
打赏
举报
回复
问题是,2个节点本身的位置还未知,如何求它们的上辈结点?
icecools
2006-09-28
打赏
举报
回复
位置是随意的,可不可以先把2个节点的祖先节点都求出来然后再求交集?
zzwu
2006-09-28
打赏
举报
回复
如果预先未知道两个结点在树中的位置,那只能从根结点开始,搜索整个树.
zzwu
2006-09-28
打赏
举报
回复
被考察的两个节点预先是如何给出的?
寻找
二叉树
两结点
最近
的
祖先
(1)拟定合适的
二叉树
的输入形式和构造算法; (2)能够以直观的形式观察所建立的
二叉树
的结构;
二叉树
中最低公共
祖先
本程序为VS2010编写,其中包含两种方法实现此题目。
算法入门教程——
二叉树
循序渐进的讲解
二叉树
的相关知识。其中包括二叉搜索树的插入、删除与查询、
二叉树
的遍历、
求
一颗
二叉树
的高度等重要且经典的知识。
面试题68 – II.
二叉树
的
最近
公共
祖先
面试题68 – II.
二叉树
的
最近
公共
祖先
【简单题】【递归】 给定一个
二叉树
, 找到该树中两个指定
节点
的
最近
公共
祖先
。 百度百科中
最近
公共
祖先
的定义为:“对于有根树 T 的两个结点 p、q,
最近
公共
祖先
表示为一个结点 x,满足 x 是 p、q 的
祖先
且 x 的深度尽可能大(一个
节点
也可以是它自己的
祖先
)” 例如,给定如下
二叉树
: root = [3,5,1,6,2,0,8,null,null,7,4] 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出:3 解释:
节点
5 和
节点
1 的
最近
公共
祖先
是
节点
3 输入:root
使用C语言
求
二叉树
结点的最低公共
祖先
的方法
主要介绍了使用C语言
求
二叉树
结点的最低公共
祖先
的方法,文中还给出了ACM的练习题目,需要的朋友可以参考下
数据结构与算法
33,006
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章