思路
-
思路一
- 所谓中序后继就是中序遍历的下一个结点
- 所以我们可以直接中序遍历,同时记录前一个遍历到的结点pre,如果pre和p相等,那么就返回当前结点
- 时间复杂度O(n) 空间复杂度O(h) (递归栈的深度就是树的高度)
class Solution { public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { TreeNode cur = root, pre = null; Stack<TreeNode> stack = new Stack<>(); while (null != cur || !stack.isEmpty()) { while (null != cur) { stack.push(cur); cur = cur.left; } cur = stack.pop(); if(null != pre && pre == p) return cur; pre = cur; cur = cur.right; } return null; } }
-
思路二
- 二叉搜索树可以进行二叉查找~ 待寻找结点的特点在于他的值val是大于p.val的最小值(比p的val大的值中最小的一个)
- 所以我们可以利用二叉查找的方式 如果cur.val <= p.val,那就到右边去寻找,如果cur.val > p.val,那就记录当前结点,然后继续到左边去寻找
- 时间复杂度O(h) 空间复杂度O(h)
class Solution { public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { TreeNode flag = null; while (null != root) { if (root.val <= p.val) root = root.right; else { flag = root; root = root.left; } } return flag; } }