编程语言
首页 > 编程语言> > java-最好的方法是什么?二进制搜索树:仅当if语句时使用的最低共同祖先

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 >当前节点的值小于v1(v1在右子树中)或大于v2时,请移向v1或v2.这取代了您的递归遍历.

这是我检查过的快速实施:

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