设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。
如果指定节点没有对应的“下一个”节点,则返回null。
示例 1:
输入: root = [2,1,3], p = 1
2
/ \
1 3
输出: 2
示例 2:
输入: root = [5,3,6,2,4,null,null,1], p = 6
5
/ \
3 6
/
2 4
/
1
输出: null
有递归法和非递归法:
思想类似, 与root 节点比较,若p.val >= root.val, 从右子树里面去找,否则从左子树中去找(此时,保留root 节点,有可能是后继节点)
递归法:
class Solution {
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
if(root == null ) {
return null;
} else if(root.left == null && root.right == null) {
return root.val == p.val ? null : root;
}
if(root.val<= p.val) {
return inorderSuccessor(root.right, p);
} else {
TreeNode res = inorderSuccessor(root.left, p);
return res == null ? root : res;
}
}
}
非递归法:
class Solution {
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
TreeNode temp = root;
TreeNode res = null;
while(temp != null) {
if(temp.val <= p.val) {
temp = temp.right;
} else {
res = temp;
temp = temp.left;
}
}
return res == null ? temp : res;
}
}