| java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846 |
|---|
| 解题思路 |
|---|
- 从根节点开始,比较结点值和插入值
- 如果比当前结点大,让其去右子树
- 如果比当前结点小,让其去左子树
- 这一步可选:题目说明,如果要插入的值,在当前结点位置也合理的话(比左子树大,比右子树小),可以替换当前结点的值
1. 递归模拟插入操作
| 代码:时间复杂度O(n),但因为递归需要栈,空间复杂度O(n).所以推荐使用迭代法 |
|---|
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root == null) return new TreeNode(val);//如果root为null,那么直接让val成为根结点返回
dfs(root,val);//进入递归
return root;
}
public void dfs(TreeNode root, int val) {
if(val == root.val) return;//题目要求,不需要重复元素
else if(root.val > val){//比当前结点小,就去左边
if(root.left == null) root.left = new TreeNode(val);//如果当前节点左子树为null,让val成为新的左子树
else insertIntoBST(root.left,val);//如果val不是新的左子树,说明node本身就有左子树,它需要继续去左子树比较
} else if(root.val < val){//如果比当前结点大,就去右边
if(root.right == null) root.right = new TreeNode(val);
else insertIntoBST(root.right,val);
}
}
}
2. 迭代模拟插入操作
| 代码:时间复杂度O(n),空间复杂度O(1) |
|---|
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root == null) return new TreeNode(val);//如果root为null,那么直接让val成为根结点返回
TreeNode node = root;//获取root,进行插入操作
while(node!=null){//如果有的遍历
if(val < node.val) {//比当前结点小,就去左边
node.left = node.left == null?new TreeNode(val):node.left;//如果当前节点左子树为null,让val成为新的左子树
if(node.left.val == val) break;//如果val成为新的左子树,说明val插入成功,可以返回了
else node = node.left;//如果val不是新的左子树,说明node本身就有左子树,它需要继续去左子树比较
}else{//如果比当前结点大,就去右边
node.right = node.right == null?new TreeNode(val):node.right;
if(node.right.val == val)break;
else node = node.right;
}
}
return root;
}
}
本文介绍了如何在Java中使用递归和迭代方法实现二叉搜索树的插入操作,讨论了递归方法的时间复杂度为O(n)且空间复杂度为O(n),而迭代方法的时间复杂度和空间复杂度均为O(1),并提供了相应的代码示例。



533

被折叠的 条评论
为什么被折叠?



