社区
数据结构与算法
帖子详情
如何求二叉树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)的,谢谢!
...全文
1086
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
打赏
举报
回复
被考察的两个节点预先是如何给出的?
二叉树
中两结点
最近
的
共同
祖先
算法
拟定出合适的
二叉树
的输入形式; 构造出相应的
求
共同
祖先
的算法; 能够以直观的形式观察到所建立的
二叉树
; 采用Microsoft Visual C++ 6.0 编译环境进行调试运行。
二叉树
中最低公共
祖先
本程序为VS2010编写,其中包含两种方法实现此题目。
寻找
二叉树
两结点
最近
的
祖先
(1)拟定合适的
二叉树
的输入形式和构造算法; (2)能够以直观的形式观察所建立的
二叉树
的结构;
面试题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语言
求
二叉树
结点的最低公共
祖先
的方法
算法分析 我们直接来分析O(n)的算法。 比如
求
节点
F和
节点
H的最低公共
祖先
,先
求
出从根
节点
A到F的路径,再
求
出A到H的路径,那么最后一个相同的
节点
就是最低公共
祖先
。A->B->D->F和A->B->E->H,最后相同的
节点
事B,所以最低公共
祖先
是B
节点
。
求
根
节点
到指定
节点
的算法先前已经更新过了,复杂度是O(n),所以总的时间复杂度是O(n)。 条件细化: (1)树如果是
二叉树
,而且是二叉排序树。 这中条件下可以使用二叉排序树的搜索功能找到最低公共
祖先
。 (2)树不是二叉排序树,连
二叉树
都不是,就是普通的树。 1,如果树中有指向父
节点
的指针。
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章