java-最好的方法是什么?二进制搜索树:仅当if语句时使用的最低共同祖先
作者:互联网
我已经用if语句解决了这个问题.可以通过其他各种方式解决它.我刚刚开始编程,所以我无法考虑使用任何其他数据结构来解决此问题.
我的问题 :
如何在各种方式中选择最佳方法?与我的直接幼稚方法相比,这种最佳方法的优点/缺点是什么?
一般而言,不仅针对此问题.如何解决任何问题?
问题陈述
您将获得指向二进制搜索树的根以及两个值v1和v2的指针.您需要在二进制搜索树中返回v1和v2的最低公共祖先(LCA).您只需要完成功能.
我的代码:
static Node lca(Node root,int v1,int v2)
{
Node r = root;
if( r == null){
return null;
}
else if(r.data == v1 || r.data == v2){
return r;
}
else if(r.data > v1 && r.data < v2){
return r;
}
else if(r.data > v2 && r.data < v1){
return r;
}
else if( r.data > v1 && r.data > v2){
lca(r.left, v1, v2);
}
else if( r.data < v1 && r.data < v2){
lca(r.right, v1, v2);
}
return null;
}
问题链接:https://www.hackerrank.com/challenges/binary-search-tree-lowest-common-ancestor
解决方法:
好吧,这就是我如何解决这个问题.这取决于您正在处理二进制搜索树的事实.
对于任何给定的节点,当且仅当min(v1,v2)在其左子树中并且max(v1,v2)在其右子树中时,它才可以是LCA.如果不正确,则当前节点显然不能成为祖先,因为v1或v2不能为后代.继续遍历树,直到满足LCA条件.
您的解决方案是正确的,并且您有直觉,但是我们可以去除递归并简单地执行迭代BST查找,该查找还隐式包含您的if检查.
就优势而言,您实际上只是在浪费隐式递归调用堆栈空间,而该空间也必须在末尾释放.我们两个实现都在O(log N)中运行,因为在最坏的情况下,您将检查log N-1个节点,其中v1和v2是完整树的底部的直接同级.
实作
>如果v1
这是我检查过的快速实施:
static Node lca(Node root, int v1, int v2) {
if (root == null) return null;
if (v1 > v2) {
int temp = v2;
v2 = v1;
v1 = temp;
}
while (root.data < v1 || root.data > v2) {
if (root.data < v1) root = root.right;
else if (root.data > v2) root = root.left;
}
return root;
}
标签:data-structures,binary-tree,tree,binary-search-tree,java 来源: https://codeday.me/bug/20191120/2040697.html