二叉搜索树中的中序后继 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?
▷