原题网址:https://leetcode.com/problems/inorder-successor-in-bst/
Given a binary search tree and a node in it, find the in-order successor of that node in the BST.
Note: If the given node has no in-order successor in the tree, return null
.
方法一:普通的二叉树中序遍历,没有使用到BST特性,时间复杂度O(n)。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private TreeNode prev, p, succ;
private void inorder(TreeNode root) {
if (succ != null) return;
if (root.left != null) inorder(root.left);
if (prev == p) {
succ = root;
prev = root;
return;
}
prev = root;
if (root.right != null) inorder(root.right);
}
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
if (root == null) return null;
this.p = p;
inorder(root);
return succ;
}
}
方法二:利用BST特性,通过栈来保存中间状态。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
Stack<TreeNode> stack = new Stack<>();
private boolean find(TreeNode root, TreeNode p) {
stack.push(root);
if (root == p) return true;
if (root.val < p.val) return find(root.right, p);
return find(root.left, p);
}
private TreeNode leftmost(TreeNode root) {
if (root.left != null) return leftmost(root.left);
return root;
}
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
find(root, p);
TreeNode node = stack.pop();
if (node==p && node.right != null) return leftmost(node.right);
while (!stack.isEmpty()) {
TreeNode prev = node;
node = stack.pop();
if (prev == node.left) return node;
}
return null;
}
}
方法三:利用BST特性判断节点的可能位置,时间复杂度O(logn)。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private TreeNode prev, p, succ;
private void find(TreeNode root) {
if (succ != null) return;
if (root.val == p.val) {
prev = root;
if (root.right != null) find(root.right);
} else if (root.val < p.val) {
if (root.right != null) find(root.right);
} else {
// root.val > p.val
if (root.left != null) find(root.left);
if (prev != null && succ == null) {
succ = root;
}
}
}
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
if (root == null) return null;
this.p = p;
find(root);
return succ;
}
}
另一种实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private boolean found = false;
private TreeNode p;
private TreeNode succ;
private void find(TreeNode node) {
if (node == null) return;
if (succ != null) return;
if (p.val < node.val) find(node.left);
if (node == p) found = true;
else if (found && succ == null) succ = node;
if (p.val >= node.val) find(node.right);
}
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
this.p = p;
find(root);
return succ;
}
}