public class InorderSuccessorInBST {//平衡二叉树查找后继结点 public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { if (p == null) { return null; } if (getLastEntry(root) == p) {//根节点的最右边的节点是最后节点,是没有后继结点的。 return null; } if (p.right != null) {//查找第一个右节点的最左边的节点。 return getFirstEntry(p.right); } //p.right == null TreeNode parent = root;//只有left,right没有parent节点。 TreeNode temp = root; while (parent != null) { if (parent == p) { break; } else if (p.val < parent.val) {//左边走的时候,twmp指向父节点,parent指向子节点。挨着走。 temp = parent; parent = parent.left; } else {//右边走的时候,temp不变, parent = parent.right; } } return temp; } private TreeNode getLastEntry(TreeNode p) { while (p.right != null) { p = p.right; } return p; } private TreeNode getFirstEntry(TreeNode p) { while (p.left != null) { p = p.left; } return p; } }