JAVA怎么求共同祖先_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;

}

解决方法:

好吧,这就是我如何解决这个问题.这取决于您正在处理二进制搜索树的事实.

对于任何给定的节点,当且仅当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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值