【发布时间】:2014-01-29 17:34:04
【问题描述】:
我有这段代码,它计算Binary tree 中给定两个nodes 的Least common Ancestor。
目前,它假设两个节点都存在。我可以编写一个辅助方法来检查节点是否存在,然后调用LCABT 方法。那将需要遍历树两次。我想知道是否有一种方法可以检查和处理当前代码中不存在节点的情况。
//LCA of Binary tree
public static Node LCABT(Node root, int v1, int v2){
if (root==null)
return null;
if (root.data==v1 || root.data==v2){
return root;
}
Node left = LCABT(root.left,v1,v2);
Node right = LCABT(root.right,v1,v2);
if(left!=null && right!=null)
return root;
else if (left!=null)
return left;
else if (right!=null)
return right;
return null;
}
【问题讨论】:
-
@NiklasB。 “而不是 O(log n),这是可能实现的”——这仅在平衡二叉 搜索树中,或者如果您知道节点所在的位置。
-
@Dukeling:是的,我现在明白了。我假设有一棵搜索树,但它可能不是一棵。算法仍然不应该以这里介绍的形式工作。
-
@NiklasB.:我不明白你的意思。但是现在的代码可以工作。如果两者都不存在,我返回 null。但是如果其中一个存在而另一个不存在,我返回作为节点存在的那个,这是不正确的
-
忽略我的愚蠢。我无法阅读代码。至于您的问题,如果
v1 !=v2` 并且两者都存在,您将在某个时候遇到if(left!=null && right!=null)的情况。您可以只记住这是否发生或在递归期间将其传递到调用堆栈。如果不是,则树中最多存在一个节点(假设树中没有重复节点)。 -
问题是如果一个存在而另一个不存在。例如,我有 root.data=5、v1=5 和 v2=10,假设 v2 不存在。我当前的代码,只是从 root.data=v1 返回 root,但它没有检查 v2 是否存在..希望我有意义..?
标签: java algorithm binary-tree least-common-ancestor