Question:
Given a binary search tree and a node in it, find the in-order successor of that node in the BST.
Solution:
分两种情况讨论,参考了https://segmentfault.com/a/1190000003792039,存下所有路径
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
Stack<TreeNode> st=new Stack<TreeNode>();
while(p!=root){
st.push(root);
if(root.val>p.val)
root=root.left;
else
root=root.right;
}
if(p.right!=null)
return FindMostLeft(p.right);
else{
return Find(p,st);
}
}
public TreeNode FindMostLeft(TreeNode node)
{
while(node.left!=null)
node=node.left;
return node;
}
public TreeNode Find(TreeNode p, Stack<TreeNode> st){
while(!st.isEmpty()&&st.peek().val<p.val)
st.pop();
if(st.isEmpty())
return null;
else
return st.peek();
}
}
对。。根本不用分类讨论
if (root == null || p == null) return null;
TreeNode res=null;
while(root!=null){
if(root.val<=p.val)
root=root.right;
else{
res=root;
root=root.left;
}
}
return res;
递归求
if(root==null) return null;
if(root.val<=p.val)
return inorderSuccessor(root.right,p);
else
{
TreeNode left=inorderSuccessor(root.left,p);
return left==null?root:left;
}
这个方法也可以求前面那个节点~改一下就好
public TreeNode predecessor(TreeNode root, TreeNode p) {
if (root == null)
return null;
if (root.val >= p.val) {
return predecessor(root.left, p);
} else {
TreeNode right = predecessor(root.right, p);
return (right != null) ? right : root;
}
}