我只用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
好吧,我是这样处理这个问题的。这取决于这样一个事实,即您正在处理一个二叉搜索树。
对于任何给定的节点,当且仅当min(v1,v2)
在其左子树中,max(v1,v2)
在其右子树中时,它可以是LCA。如果不是这样,那么当前节点显然不可能是祖先,因为v1或v2都不可能是后代。继续向下遍历树,直到满足LCA条件。
您的解决方案是正确的,而且您有直觉,但是我们可以去掉递归,简单地执行迭代BST查找,它也隐式地包含if
检查。
就优点而言,您实际上只是在浪费隐式递归调用堆栈空间,它还必须在最后释放该空间。我们的两个实现都在O(logn)
中运行,因为在最坏的情况下,您将检查logn-1
节点,其中V1
和V2
是位于完整树底部的直接兄弟。
实施
>
交换v1
和v2
如果v1
min
和
max
检查的需要)。这隐式地包含
if
检查
v1
v2
当当前节点的值小于
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;
}
问题内容: 这是一个受欢迎的面试问题,我唯一可以找到的有关该主题的文章是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循环,如果值匹配则使用早期退出。在最坏的情