社区
数据结构与算法
帖子详情
如何求二叉树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)的,谢谢!
...全文
1067
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
作业
写回复
配置赞助广告
用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
common-father.rar_Father
如何
求
二叉树
的任意两个
节点
的公共
祖先
,可以通过编译
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章