给定一个二叉查找树(什么是二叉查找树),以及一个节点,求该节点在中序遍历的后继,如果没有返回null
样例
给出 tree = [2,1]
node = 1
:
2
/
1
返回 node 2.
给出 tree = [2,1,3]
node = 2
:
2
/ \
1 3
返回 node 3.
挑战
O(h),其中h是BST的高度。
注意事项
保证p是给定二叉树中的一个节点。(您可以直接通过内存地址找到p)
解题思路1:
先中序遍历存进数组,然后二分搜索出结果。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
/*
* @param root: The root of the BST.
* @param p: You need find the successor node of p.
* @return: Successor of p.
*/
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
// write your code here
List<TreeNode> list = new ArrayList<>();
inorder(root, list);
int l = 0;
int r = list.size()-1;
while(l <= r){
int mid = l + (r - l)/2;
if(list.get(mid).val == p.val){
if(mid < list.size()-1)
return list.get(mid+1);
else //若最后一位是结果,则没有后继
return null;
}else if(list.get(mid).val > p.val)
r = mid - 1;
else
l = mid + 1;
}
return null;
}
private void inorder(TreeNode root, List<TreeNode> list){
if(root == null)
return;
inorder(root.left, list);
list.add(root);
inorder(root.right, list);
}
}
解题思路2:
二分循环搜索可能的candidate。
也可以用同样的思路递归。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
/*
* @param root: The root of the BST.
* @param p: You need find the successor node of p.
* @return: Successor of p.
*/
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
// write your code here
TreeNode res = null;
while(root != null){
if(p.val >= root.val)
root = root.right;
else{
res = root;
root = root.left;
}
}
return res;
}
}