方法1:DFS
TreeNode prev;
TreeNode p;
public TreeNode inorderPredecessor(TreeNode root, TreeNode p) {
this.p = p;
dfs(root);
return prev;
}
private void dfs(TreeNode root) {
if (root == null) return;
if (p.val > root.val) {
prev = root;
dfs(root.right);
} else {
dfs(root.left);
}
}
方法2:DFS
TreeNode predecessor;
public TreeNode inorderPredecessor(TreeNode root, TreeNode p) {
dfs(root, p);
return predecessor;
}
private void dfs(TreeNode root, TreeNode p) {
if (root == null) return;
dfs(root.left, p);
if (root.val < p.val) predecessor = root;
dfs(root.right, p);
}
方法3:迭代
public TreeNode inorderPredecessor(TreeNode root, TreeNode p) {
TreeNode predecessor = null;
while (root != null) {
if (root.val >= p.val) {
root = root.left;
} else {
predecessor = root;
root = root.right;
}
}
return predecessor;
}