java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/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;
}
}