Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这里用Java实现的二叉树LCA的时间复杂度是多少_Java_Algorithm_Binary Tree_Big O_Least Common Ancestor - Fatal编程技术网

这里用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)