题目
思路
题目给出根节点root和目标节点p,寻找p的后继节点
我们比较root和p
-
root.val <= p.val
:- 因为是二叉搜索树,说明root,包括root的左子树上所有的节点都小于p,都不可能是p的后继节点,跳到root.right继续寻找
-
root.val > p.val
:- root本身就比p大了,因此root的右子树不可能成为p的后继节点,跳到root.left继续寻找
- 但root本身是可能成为后继节点,不能排除,因此需要用
res
记录 - 如果后面有更合适的节点,就会覆盖
res
,如果没有,那么res
就是答案
注意,如果不是搜索二叉树,则无法用上面的方法判断,因为无法保证root的左子树都小于root,root的右子树都大于root
代码
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
TreeNode cur = root;
TreeNode res = null;
while (cur != null) {
// 当前节点,和左子树的所有节点,都不满足条件,跳过
if (cur.val <= p.val) {
cur = cur.right;
} else {
// 当前节点满足条件,但当前节点的右子树的所有节点都不满足条件
res = cur;
cur = cur.left;
}
}
return res;
}