二分搜索数的rank,老师给说下思路

二分搜索数的rank,老师给说下思路

# 具体遇到的问题

# 报错信息的截图

# 相关课程内容截图

# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

在这里输入代码,可通过选择【代码语言】突出显示

rank(e){
    rank(,e,);
}
rank(Node node,e,dept){
    (==node) -;
    (node..compareTo(e)<){
      rank(node.,e,++dept);
    }
    (node..compareTo(e)==){
        -dept;
    }
   rank(node.,e,++dept);
}


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

rank 的大体逻辑上,如果当前节点比要寻找的元素小,往右子树找,rank 值需要把左子树和自己的节点总数添加上;


如果当前节点比要寻找的元素大,直接往左边找就可以,不需要求 floor。


另外,你的代码对于 Node 中 sz 的维护可能有问题。我写了一版代码,可以参考。另外,在代码中,也包含一个测试方式。简单来说,在一棵二分搜索树中,包含 1-n 共 n 个元素,那么元素 i 的 rank 值就应该是 i。


https://git.imooc.com/class-105/Play-Algorithms-and-Data-Structures/src/master/15-Binary-Search-Tree/Optional-02-Rank/src/BST.java


继续加油!:)

liuyubobobo 2020-10-23 11:14:52

每个节点需要记录以这个节点为根节点的子树有多少个元素。一个节点的 rank 值就是这个节点的左子树的节点个数 + 1。


继续加油!:)


  • 提问者 学无止境呀呀呀 #1
    是这样么? public int rank(E e){ return rank(root,e); } private int rank(Node node,E e){ if (node==null)return -1; if (node.data.compareTo(e)==0){ return node.left==null?1:node.left.size+1; } if (node.data.compareTo(e)<0){ return rank(node.right,e); } Node tempNode = floor(node.left, e); if( tempNode != null ) return tempNode.left.size+1; return node.left==null?1:node.left.size+1; } private Node add(E e,Node node){ if (node==null){ node=new Node(e); return node; } if (node.data.compareTo(e)<0){ node.right=add(e,node.right); node.size++; }else if (node.data.compareTo(e)>0){ node.left=add(e,node.left); node.size++; } return node; } private class Node{ public E data; private Node left; private Node right; private int size=0; public Node(E e,Node node){ this.data=e; this.right=node.right; this.left=node.left; } public Node(E e){ this.data=e; this.right=null; this.left=null; this.size++; } public Node(){ this.data=null; this.right=null; this.left=null; } }
    2020-10-23 22:27:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2638    人
  • 解答问题       1106    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师