这里用Java实现的二叉树LCA的时间复杂度是多少
我用这段代码在这里用Java实现的二叉树LCA的时间复杂度是多少,java,algorithm,binary-tree,big-o,least-common-ancestor,Java,Algorithm,Binary Tree,Big O,Least Common Ancestor,我用这段代码在二叉树中查找两个节点的最小共同祖先。我认为时间复杂度是O(logn)。但需要专家意见。这段代码在我的输入上运行得相当好,但我不确定是否已经对其进行了详尽的测试 这是密码 //LCA of Binary tree public static Node LCABT(Node root, int v1, int v2){ if (root==null) return null; if (roo
二叉树中查找两个节点的最小共同祖先
。我认为时间复杂度是O(logn)
。但需要专家意见。这段代码在我的输入上运行得相当好,但我不确定是否已经对其进行了详尽的测试
这是密码
//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 return right;
}
我很确定这是在O(n)
中运行的,因为您要通过整个图形(即,在每个节点上,您要向左右两个方向移动)
我建议您阅读。您的代码的时间复杂度是O(n)
,因为您正在遍历整个树,也就是说,您正在访问它的所有节点。但是,如果您没有BST,而只有一个二叉树,那么在没有父节点上的指针的情况下,这是可以实现的最好结果(在这种情况下,构建从两个节点到根节点的路径,并返回两个路径中的节点)。如果您有BST,那么您可以在O(h)
中定位两个节点并找到最不常见的祖先,其中h是树的高度,如果树是平衡的,则为O(logn)
最后一句话-如果你正在准备比赛或面试,一定要注意角逐。您的代码不处理其中一个节点不包含在树中的情况。它处理您提到的角落情况,您认为它为什么不处理?@user1988876如果树的左侧有v1
,而v2
根本不在树中,无论是否存在v2
,您都将返回v1
。有人可能会争辩说,在这种情况下,它也应该返回null
。如果两个节点都不包含在树中,则返回null
,这是正确的-我将更新我的答案。这是正确的。这意味着在调用此方法之前,我需要检查是否存在这些问题,或者我是否可以在此处处理这些问题?@user1988876不,您可以在此过程中处理它。首先要做的是不要返回left
/right
,除非您确定两个节点都在该子树中。如何确定?不要在if(root.data==v1 | | root.data==v2)
行中返回root
,而是进一步检查是否存在其他节点。换句话说,在您的代码中区分“我在左子树中找到了一个共同的祖先”和“我在左子树中恰好找到了一个节点”。因此,如果(root.data==v1)
为true,我将在两个子树中检查v2,如果v2存在,则返回root,否则返回null;如果(root.data==v2)