ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-20 02:02:20  阅读:271  来源: 互联网

标签:data-structures binary-tree tree binary-search-tree java


我已经用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有