树与图中等2 种解法
#701二叉搜索树中的插入操作
将一个不存在于树中的值插入二叉搜索树并返回根节点。
#二叉搜索树#递归#迭代
原题
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
示例 1:
输入:root = [4,2,7,1,3], val = 5 输出:[4,2,7,1,3,5] 解释:另一个满足题目要求可以通过的树是:![]()
示例 2:
输入:root = [40,20,60,10,30,50,70], val = 25 输出:[40,20,60,10,30,50,70,null,null,25]
示例 3:
输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5 输出:[4,2,7,1,3,5]
提示:
- 树中的节点数将在
[0, 104]的范围内。 -108 <= Node.val <= 108- 所有值
Node.val是 独一无二 的。 -108 <= val <= 108- 保证
val在原始BST中不存在。
解题主线
- 沿搜索路径遇到 null 的位置就是合法插入点。
解法 1:递归插入
递归返回插入后的子树根,并回接到父节点。
-
时间复杂度: O(h)
-
空间复杂度: O(h)
import java.util.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
// 根据大小关系沿唯一搜索路径下行,路径外的子树无需改动。
// 首个空链接就是保持 BST 有序性的插入位置,只在这里创建新节点。
if (root == null) return new TreeNode(val);
if (val < root.val) root.left = insertIntoBST(root.left, val);
else root.right = insertIntoBST(root.right, val);
return root;
}
}解法 2:迭代插入
维护父节点沿搜索路径走到空位置,再创建并连接新节点。
-
时间复杂度: O(h)
-
空间复杂度: O(1)
import java.util.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
// 根据大小关系沿唯一搜索路径下行,路径外的子树无需改动。
// 首个空链接就是保持 BST 有序性的插入位置,只在这里创建新节点。
if (root == null) return new TreeNode(val);
TreeNode current = root;
while (true) {
if (val < current.val) {
if (current.left == null) {
current.left = new TreeNode(val);
break;
}
current = current.left;
} else {
if (current.right == null) {
current.right = new TreeNode(val);
break;
}
current = current.right;
}
}
return root;
}
}边界与易错点
- 题目保证值不存在,因此无需定义重复值放左还是放右。
- 空树插入后新节点就是根。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
leetcode/src/main/java/tree/Q701_insertIntoBST.java