1、题目描述
2、解题思路
对于一个 BST 的中间某个节点 node 来说,它的后继节点要么在它的左子树当中,要么在它的祖宗节点当中(父结点,或者父结点的父结点…)
因此,若 node 有右子树,则后继节点肯定在右子树中,从右子树往下找,尽量往左边走,直到遇到一个 tmp,它没有左子节点,那么此时 tmp 就是 node 的后继节点。
若 node 没有右子树,则后继节点肯定在祖宗节点当中,从父结点出发往上走,直到遇到一个 tmp,它的左子节点是 node 的祖宗节点,那么,此时 tmp 就是 node 的后继节点。
3、解题代码
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node parent;
};
*/
class Solution {
public Node inorderSuccessor(Node x) {
if (x.right != null) {
// 有右子树,则后继在树的相对较低的地方,往下走,尽量往右子树的左边走
x = x.right;
while (x.left != null) x = x.left;
return x;
}else {
// 没有右子树,则后继在树的相对较高的地方,往上找
// 直到找到一个祖宗节点 tmp,它是它父节点的左子节点
while (x.parent != null && x == x.parent.right) x = x.parent;
// x.parent == null 或 x == x.parent.left
return x.parent;
}
}
}