高级农民
- 积分
- 2128
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-2-17
- 最后登录
- 1970-1-1
|
本帖最后由 r0_0e 于 2021-7-14 23:07 编辑
thrillerの空 的那个带图的讲得很好了。
我就再多说几句吧,希望对楼主能有帮助。
递归(recursion)就是调用自己,也就是说在分析过数据之后,对其中的一部分,做同样的事情。
当达到某个条件时,停止递归调用。
所以,一开始的时候,你要想好,在什么样的条件下,需要停止递归,也就是找到一个退出的状况。
之后再按照需求分析,如何切割处理你手里的数据。
具体到你的这个题目:
- public TreeNode successor(TreeNode root, TreeNode p) {
- //这个就是最基本的退出条件
- //如果root是null,那就什么都不用做,直接返回null就好了。
- //其实我觉得还需要加一个 p == null 的情况
- //就是这个样子 if(root == null || p == null) return null;
- //具体要看你的题目是什么样的,如果他保证p不会是null,就不用管p了
- if (root == null) return null;
- //从这里开始,就是要具体判断你的数据了
- //前面那个带图的答案里面详细解释了BST的结构,我想你大概也明白了
- //如果当前root.val <= p.val,就说明,对于该BST的inorder traverse,p的successor应该是在root.right里面
- //所以我们要做的,就是对root.right做同样的事情,也就是直接调用successor(root.right, p)这样了
- if (root.val <= p.val) return successor(root.right, p);
- //如果root.val > p.val,也就是else里面要处理的情况了,那么p的successor有可能是root,也有可能在root.left里面
- //所以我们要先去root.left里面找一下,这里的TreeNode left不太好,容易让人误会,我觉得还不如就叫tmp呢
- //如果在root.left里面找到的tmp是null,那说明root.left里面没有p的successor,就应该返回root本身
- //如果tmp不是null,那说明我们在root.left里面找到了那个successor,就返回tmp
- //这个逻辑可以直接用 ? : 写成一行
- else {
- TreeNode left = successor(root.left, p);
- return (left != null) ? left : root;
- }
- }
复制代码
没啦……
希望对你有帮助哇
求加米……
|
|