题目
设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。
如果指定节点没有对应的“下一个”节点,则返回null。
示例
输入: root = [2,1,3], p = 1
2
/
1 3
输出: 2
输入: root = [5,3,6,2,4,null,null,1], p = 6
5
/ \
3 6
/
2 4
/
1
输出: null
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/successor-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:暴力遍历
1、先中序遍历存储结点顺序。
2、遍历结点。
Java实现
class Solution {
List<TreeNode> res = new ArrayList<>();
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
traverse(root);
for (int i = 0; i < res.size(); i++) {
if (res.get(i).equals(p) && i + 1 < res.size()) return res.get(i + 1);
}
return null;
}
public void traverse(TreeNode root) {
if (root == null) return;
traverse(root.left);
res.add(root);
traverse(root.right);
}
}
方法2:根据二叉搜搜索树的性质
找P的后继,本质是找到最靠近p节点且值 大于 p节点值的那个节点。
1、如果当前结点tmp的值 <= p结点的值,根据二叉树性质,就应该去当前结点tmp的右子树继续找。
2、如果当前结点tmp的值 > p结点的值:
tmp有可能是答案结点,可先暂存。
再去tmp的左子树找是否有更靠近p结点的值。
Java实现
class Solution {
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
TreeNode tmp = root;
TreeNode res = root;
while (tmp != null) {
if (tmp.val <= p.val) {
tmp = tmp.right;
} else {
res = tmp;
tmp = tmp.left;
}
}
return res.val <= p.val ? null : res;
}
}