二叉搜索树中的中序后继
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 37 ms, 内存: 19.6 MB
/*
* 思路:
* 使用中序遍历收集所有节点,然后找到目标节点 p 的下一个节点。
* 利用 Java Stream API 来实现。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
List<TreeNode> nodes = new ArrayList<>();
inorderTraversal(root, nodes);
return IntStream.range(0, nodes.size())
.filter(i -> nodes.get(i).val > p.val)
.mapToObj(nodes::get)
.findFirst()
.orElse(null);
}
private void inorderTraversal(TreeNode node, List<TreeNode> nodes) {
if (node == null) return;
inorderTraversal(node.left, nodes);
nodes.add(node);
inorderTraversal(node.right, nodes);
}
}
解释
方法:
此题解通过利用二叉搜索树的性质来寻找中序后继。根据二叉搜索树的特性,左子树的所有节点值都小于根节点,而右子树的所有节点值都大于根节点。因此,如果当前节点的值小于等于目标节点p的值,那么中序后继应该在右子树中;如果当前节点的值大于p的值,当前节点可能是中序后继,但还需要继续探索其左子树以确认是否存在更小但大于p的值的节点。通过这样的方式,我们可以确保找到的后继是比p节点值大中最小的一个。
时间复杂度:
O(h),其中 h 是树的高度。对于平衡的二叉搜索树,h=log(n),而对于非平衡树,h可能接近n。
空间复杂度:
O(1)
代码细节讲解
🦆
在算法中,如果节点p是树中的最大值,你是如何处理这种情况的,以确保返回值为null?
▷🦆
为什么在寻找中序后继时,当当前节点值大于p的值时,选择向左子树移动而不是右子树?
▷🦆
如果树结构发生改变(例如添加或删除节点),在不重新构建整个树的情况下,这种方法是否仍然有效?
▷