当前位置: 首页 > 知识库问答 >
问题:

最好的方法是什么?二叉搜索树:仅使用if语句的最低公共祖先

林星华
2023-03-14

我只用if语句解决了这个问题。它可以用其他各种方法来解决。我刚刚开始编程,所以我想不出使用任何其他数据结构来解决这个问题。

我的问题:
如何在各种方法中选择最好的方法?和我的直接天真方法相比,这种最佳方法的优点/缺点是什么。

不仅针对这个问题,总的来说。如何解决任何问题?

我的代码

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-lows-common-enthestor

共有1个答案

华欣荣
2023-03-14

好吧,我是这样处理这个问题的。这取决于这样一个事实,即您正在处理一个二叉搜索树。

对于任何给定的节点,当且仅当min(v1,v2)在其左子树中,max(v1,v2)在其右子树中时,它可以是LCA。如果不是这样,那么当前节点显然不可能是祖先,因为v1或v2都不可能是后代。继续向下遍历树,直到满足LCA条件。

您的解决方案是正确的,而且您有直觉,但是我们可以去掉递归,简单地执行迭代BST查找,它也隐式地包含if检查。

就优点而言,您实际上只是在浪费隐式递归调用堆栈空间,它还必须在最后释放该空间。我们的两个实现都在O(logn)中运行,因为在最坏的情况下,您将检查logn-1节点,其中V1V2是位于完整树底部的直接兄弟。

实施

>

  • 交换v1v2如果v1 (删除对 minmax检查的需要)。这隐式地包含 if检查 v1 v2

    当当前节点的值小于v1(v1在右侧子树中)或大于v2,则移到v1v2。这将取代递归遍历。

    下面是我检查过的一个快速实现:

    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;
    }
    

  •  类似资料:
    • 问题内容: 这是一个受欢迎的面试问题,我唯一可以找到的有关该主题的文章是TopCoder的文章。对我来说不幸的是,从访谈答案的角度来看,它看起来过于复杂。 除了绘制到两个节点的路径并推导祖先之外,没有其他更简单的方法了吗?(这是一个很流行的答案,但是面试题有一个变体,要求一个固定的空格答案)。 问题答案: 恒定空间答案:(尽管不一定有效)。 有一个函数findItemInPath(int inde

    • 我试图通过自顶向下递归实现二叉树最低公共祖先(LCA)问题的解决方案。 我使用的方法是: 想法:找到在任一子树中有一个所需节点的节点,而另一个所需节点是相反的子树。 以下是确切的实现: 例如: 这将返回树的根作为结果。结果=TreeNode(2)

    • 如果我拆分while循环,有什么不同吗?谢了!

    • 我的问题是:“这是已知算法的已知问题吗?”。我怀疑是。它似乎非常类似于拓扑排序。我有一个基于合并排序的算法的想法,但如果已知的算法已经存在,就没有理由提出我自己的算法。

    • 68.1 二叉查找树 题目链接 Leetcode : 235. Lowest Common Ancestor of a Binary Search Tree 解题思路 在二叉查找树中,两个节点 p, q 的公共祖先 root 满足 root.val >= p.val && root.val <= q.val。 // java public TreeNode lowestCommonAncestor

    • 问题内容: python中最好的方法是什么:if语句中的 OR 或 IN ?考虑性能和最佳实践。 要么 谢谢。 问题答案: 最好的方法是使用 set : 因为集合中的成员资格测试为O(1)(不变成本)。 其他两种方法的复杂度相同。只是固定成本的差异。测试既有清单又有链条短路;找到匹配项后立即终止。一种使用字节码跳转序列(如果为,则跳转到末尾),另一种使用C循环,如果值匹配则使用早期退出。在最坏的情