社区
数据结构与算法
帖子详情
如何求二叉树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)的,谢谢!
...全文
1089
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)能够以直观的形式观察所建立的
二叉树
的结构;
面试题68 – II.
二叉树
的
最近
公共
祖先
给定一个
二叉树
, 找到该树中两个指定
节点
的
最近
公共
祖先
。 百度百科中
最近
公共
祖先
的定义为:“对于有根树 T 的两个结点 p、q,
最近
公共
祖先
表示为一个结点 x,满足 x 是 p、q 的
祖先
且 x 的深度尽可能大(一个
节点
...
使用C语言
求
二叉树
结点的最低公共
祖先
的方法
比如
求
节点
F和
节点
H的最低公共
祖先
,先
求
出从根
节点
A到F的路径,再
求
出A到H的路径,那么最后一个相同的
节点
就是最低公共
祖先
。A->B->D->F和A->B->E->H,最后相同的
节点
事B,所以最低公共
祖先
是B
节点
。
求
根
节点
到指定...
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章