- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经用 only if 语句解决了这个问题。它可以通过其他各种方式解决。我刚开始编程,所以我想不出使用任何其他数据结构来解决这个问题。
我的问题:
如何在多种方式中选择最佳方式?与我直接的幼稚方法相比,这种最佳方法的优点/缺点是什么。
不仅针对这个问题,一般来说。如何找到解决任何问题的可能方法?
问题陈述
你得到了指向二叉搜索树根的指针和两个值 v1 和 v2。您需要返回二叉搜索树中 v1 和 v2 的最低公共(public)祖先 (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)
时,它才可以是 LCA在它的左子树中,并且max(v1, v2)
在它的右子树中。如果这不是真的,那么当前节点显然不能是祖先,因为 v1 或 v2 都不能是后代。继续向下遍历树,直到满足 LCA 条件。
您的解决方案是正确的,并且您的直觉是正确的,但我们可以去除递归并简单地执行迭代 BST 查找,它也隐式包含您的 if
检查。
就优点而言,您实际上只是在浪费隐式递归调用堆栈空间,它最后还必须展开。我们的两个实现都在 O(log N)
中运行,因为您将检查 log N - 1
最坏情况下的节点,其中 v1
和 v2
是完整树底部的直接 sibling 。
实现
交换 v1
和 v2
如果v1 < v2
(删除需要 min
和 max
检查)。这隐含地包含了您的 if
的两者检查 v1 < root < v2
和 v2 < root < 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;
}
关于java - 什么是最好的方法?二叉搜索树 : Lowest Common Ancestor using only if statements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31409989/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
我在使用 fork 和 pipes 制作一个用于学习目的的简单程序时遇到了问题。我想要一个 child 向 parent 发送一些数据,然后这个( parent )再次将它发送给 child 。 结果
我正在制作一个需要同时做 3 件事的 python 脚本。什么是实现此目的的好方法,就像我听说的关于 GIL 的方法一样,我不再那么倾向于使用线程了。 脚本需要做的两件事将非常活跃,他们将有很多工作要
有没有办法运行sshd以便它可以(至少对于有限数量的登录)成功返回提示(可能是 busybox),即使 fork 不可用(例如,PID 不足)? 在我看来,这应该是可能的,例如,sshd 预 fork
我意识到 Bootstrap 将使用 v4 切换到 rem。但是,我使用的是当前版本 (v3),我想使用 rem。 原因?我希望网站上有可以为最终用户缩放字体大小的按钮。我相信最好的实现方式是使用 r
我试图在这个程序中将信息从子进程传递到父进程。这是到目前为止的代码,仍在清理它: #include #include #include #include main() { char *
我试图理解 fork 在 C 中是如何工作的,但我在某个地方误解了一些东西。 我去年遇到了一位教授给我的测试,但我无法回复它:我们有 3 个任务(进程或线程),伪代码如下: Th1 { display
我在使用 fork() 之类的东西时遇到了一些麻烦。 我正在开发一个 shell,用户可以在其中编写将像在普通普通 shell 中一样执行的命令。 我有一个像这样的主要功能: void Shell::
我有一个 Python 主进程,以及由主进程使用 os.fork() 创建的一组或多个 worker . 我需要将大型且相当复杂的数据结构从工作程序传递回主进程。您会为此推荐哪些现有库? 数据结构是列
我对这个 fork 语句很陌生,我不知道 C 程序上的 fork 方法。你能告诉我这段代码的三个可能的输出是什么吗? #include #include int main(void) {
for(i=0;i #include int main() { for(int i=0;i<2;i++) { if(fork()==0) { printf("Hi %d %d
背景 我正在用 C 语言编写一个共享库,与 LD_PRELOAD 动态链接,这意味着拦截和覆盖预加载它的应用程序的网络调用,例如 socket()、connect()、recv()、send()等 在
我是一名优秀的程序员,十分优秀!