我被这个问题弄得一团糟。以下是我的方法:
Lets say the two nodes are node1 and node2
For any node (lets say node1), find the path from Root to
node1 and store it in an HashMap
For the other node node2, find the path from root to node2, and while traversing back,
check if any of the nodes are present in the hashmap or not
Return the first found node
时间复杂度为O(n),空间复杂度也为O(h),其中n为树的高度
我只是想知道这种方法有多好。或者是否存在任何其他更好的解决方案。
编辑:给定的树是二叉树而不是BST。因此,查找节点所花费的时间与节点的大小成线性关系。
答案 0 :(得分:2)
如果您只需要执行一次(或几次),那么这是一个很好的方法(如果可能,您可以通过从节点向根目录进行优化)。如果你需要为不同的节点对做很多次,那么花一点时间预先计算某些东西是值得的,这将加速查询。
我认为this article很好地解释了事情。如果您有任何疑问,请回复。
答案 1 :(得分:1)
树是如何代表的?特别是,是否有对任何树节点的父节点的引用?它是一个有序的树吗?
计算从节点到根的路径是否更简单,然后比较从根到节点的路径?两条路径上的最后一个节点是共同的祖先。
我认为找到从根到节点的路径(就像你的方法一样)是O(n),其中n是树的大小,除非树是有序的......
所以你的方法有效,但如果我问你这个问题,我会期望你提出一些关于树的布局的其他问题,以便确定正确的答案......
答案 2 :(得分:0)
以下是解决最低共同祖先问题的说明。
[范围最小查询和最低共同祖先] [1]
[1]:http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Lowest共同祖先(LCA)