如何求二叉树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 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
被考察的两个节点预先是如何给出的?

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧