leetcode
leetcode 451 ~ 500
二叉搜索树中的中序后继 II

二叉搜索树中的中序后继 II

难度:

标签:

题目描述

代码结果

运行时间: 44 ms, 内存: 22.5 MB


/*
 * 思路:
 * 1. 使用递归函数查找二叉树中的后继节点。
 * 2. 在函数中使用Stream API来查找右子树中的最左节点。
 * 3. 在没有右子树的情况下,使用一个辅助函数递归查找可能的后继。
 */
import java.util.Optional;
import java.util.function.Function;
 
public class Solution {
    public Node inorderSuccessor(Node node) {
        if (node == null) return null;
        // Case 1: Node has a right subtree
        if (node.right != null) {
            return Optional.of(node.right)
                           .map(this::findMin)
                           .orElse(null);
        }
        // Case 2: Node doesn't have a right subtree
        return findSuccessor(null, node);
    }
 
    private Node findMin(Node node) {
        return Optional.ofNullable(node)
                       .map(n -> {
                           while (n.left != null) n = n.left;
                           return n;
                       })
                       .orElse(null);
    }
 
    private Node findSuccessor(Node successor, Node node) {
        if (node == null) return successor;
        if (node.val < node.val) {
            successor = node;
            return findSuccessor(successor, node.left);
        } else if (node.val > node.val) {
            return findSuccessor(successor, node.right);
        } else {
            return successor;
        }
    }
}
 

解释

方法:

这个题解的思路是根据二叉搜索树的性质来寻找中序后继节点。中序后继节点有两种情况: 1. 如果当前节点有右子树,那么中序后继就是右子树中最左边的节点。 2. 如果当前节点没有右子树,那么中序后继就是当前节点的某个祖先,该祖先的左子树包含当前节点。具体来说,从当前节点向上查找,直到找到一个节点,它是其父节点的左孩子,那么该父节点就是中序后继。

时间复杂度:

平均 O(log(n)),最坏 O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
在查找中序后继的过程中,如果节点既没有右子树也没有父节点(例如是树的根节点且没有右子树),该如何处理?
在这种情况下,由于节点没有右子树,我们无法通过右子树找到后继节点;同时,因为它没有父节点,也无法通过父节点链向上查找。因此,这种情况下节点是没有中序后继的,函数应返回None。这表示该节点是整个二叉搜索树的最大节点,即中序遍历的最后一个节点。
🦆
题解中提到,如果当前节点有右子树,中序后继是右子树的最左节点。请问这种方法是否考虑到了右子树可能不存在左子节点的情况?
题解确实考虑到了右子树可能不存在左子节点的情况。如果当前节点的右子树没有左子节点,那么右子树的根节点本身就是中序后继。所以在寻找最左节点的代码中,如果右子树根节点的left属性为None,循环将不会执行,直接返回该右子树根节点为中序后继。
🦆
在第二种情况中,向上查找父节点直到找到一个节点,它是其父节点的左孩子。如果该节点是最右侧的节点且没有后继,返回结果是否会是None?
是的,如果一个节点是最右侧的节点且没有中序后继,这意味着在向上查找的过程中,没有找到一个满足条件的节点(即当前节点是其父节点的左孩子),并且最终达到了树的根节点而根节点也没有父节点。在这种情况下,函数将返回None,因为不存在中序后继。这反映了该节点是二叉搜索树中序遍历的最后一个节点。

相关问题

二叉搜索树中的中序后继

二叉搜索树中的中序后继