12
返回列表 发新帖
楼主: pnwair
跳转到指定楼层
上一主题 下一主题
收起左侧

[树/链表/图] 请问哪位大神帮我理解一下Inorder Successor in BST

🔗
r0_0e 2021-7-15 14:05:37 | 只看该作者
全局:
本帖最后由 r0_0e 于 2021-7-14 23:07 编辑

thrillerの空 的那个带图的讲得很好了。

我就再多说几句吧,希望对楼主能有帮助。
递归(recursion)就是调用自己,也就是说在分析过数据之后,对其中的一部分,做同样的事情。
当达到某个条件时,停止递归调用。
所以,一开始的时候,你要想好,在什么样的条件下,需要停止递归,也就是找到一个退出的状况。
之后再按照需求分析,如何切割处理你手里的数据。

具体到你的这个题目:

  1. public TreeNode successor(TreeNode root, TreeNode p) {
  2.      //这个就是最基本的退出条件
  3.      //如果root是null,那就什么都不用做,直接返回null就好了。
  4.      //其实我觉得还需要加一个 p == null 的情况
  5.      //就是这个样子 if(root == null || p == null) return null;
  6.      //具体要看你的题目是什么样的,如果他保证p不会是null,就不用管p了
  7.      if (root == null) return null;
  8.      //从这里开始,就是要具体判断你的数据了
  9.      //前面那个带图的答案里面详细解释了BST的结构,我想你大概也明白了
  10.      //如果当前root.val <= p.val,就说明,对于该BST的inorder traverse,p的successor应该是在root.right里面
  11.      //所以我们要做的,就是对root.right做同样的事情,也就是直接调用successor(root.right, p)这样了
  12.      if (root.val <= p.val) return successor(root.right, p);
  13.      //如果root.val > p.val,也就是else里面要处理的情况了,那么p的successor有可能是root,也有可能在root.left里面
  14.      //所以我们要先去root.left里面找一下,这里的TreeNode left不太好,容易让人误会,我觉得还不如就叫tmp呢
  15.      //如果在root.left里面找到的tmp是null,那说明root.left里面没有p的successor,就应该返回root本身
  16.      //如果tmp不是null,那说明我们在root.left里面找到了那个successor,就返回tmp
  17.      //这个逻辑可以直接用 ? : 写成一行
  18.      else {
  19.          TreeNode left = successor(root.left, p);
  20.          return (left != null) ? left : root;
  21.      }
  22. }
复制代码



没啦……
希望对你有帮助哇

求加米……

评分

参与人数 1大米 +1 收起 理由
pnwair + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表