Given a node
in a binary search tree, find the in-order successor of that node in the BST.
If that node has no in-order successor, return null
.
The successor of a node
is the node with the smallest key greater than node.val
.
You will have direct access to the node but not to the root of the tree. Each node will have a reference to its parent node. Below is the definition for Node
:
class Node {
public int val;
public Node left;
public Node right;
public Node parent;
}
Follow up:
Could you solve it without looking up any of the node's values?
Example 1:
Input: tree = [2,1,3], node = 1
Output: 2
Explanation: 1's in-order successor node is 2. Note that both the node and the return value is of Node type.
思路:如果有右边节点,那么往右走,右边的最左边node就是答案。如果没有,找parent比node大的点,如果没有,就return null;
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node parent;
};
*/
class Solution {
public Node inorderSuccessor(Node node) {
if(node == null) {
return null;
}
if(node.right != null) {
return findLeftMost(node.right);
} else {
return findParent(node.parent, node);
}
}
private Node findParent(Node pNode, Node node) {
while(pNode != null) {
if(pNode.val > node.val) {
return pNode;
}
pNode = pNode.parent;
}
return null;
}
private Node findLeftMost(Node node) {
while(node != null && node.left != null) {
node = node.left;
}
return node;
}
}