Leetcode每日一题:22/05/16:面试题04.06:后继者


设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null

思路:二叉搜索树中序遍历有序,因此:中序后继节点,也就是比它大的最小的一个节点,

  • 若节点存在右子树,则该最小值为右子树的最左叶子节点
  • 若不存在右子树,则该最小值为左子树的父节点
  • 若不存在则null
class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        TreeNode parent = null, node = root;
        if (node == null) {
            return null;
        }
        while (node != null) {
            if (node.val > p.val) {//当前节点值大于指定节点值,说明指定节点在当前节点的左子树中
                parent = node;//parent为左子树父节点
                node = node.left;//进入左子树
            } else if (node.val < p.val) {//当前节点值小于指定节点值,说明指定节点在当前节点的右子树中
                node = node.right;//进入右子树
            } else if (node.right != null) {//此时node.val=p.val,若右子树非空,则进入右子树
                node = node.right;
                while (node.left != null) {//找到右子树中最左叶子节点
                    node = node.left;
                }
                return node;
            } else {//node.val = p.val且右子树为空
                return parent;
            }
        }
        return parent;
    }
}