/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param val int整型 
     * @return TreeNode类
     */
    TreeNode* insertToBST(TreeNode* root, int val) {
        // write code here
        //空树我可就直接诶占领了
        if(root == NULL) {
            TreeNode *newcode = new TreeNode(val);
            return newcode;
        }
        //先找位置,now定位,after同步跟上
        TreeNode *now = root;
        TreeNode *after = root;
        while (now) {
            after = now;
            if(val < now->val){
                now = now->left;
            }
            else {
                now = now->right;
            }
        }
        //now已经指向NULL叶子时 after为待插入的树枝节点
        //找到啊后,pre插入
        TreeNode *newcode = new TreeNode(val);
        if(val < after->val){
            after->left = newcode;
        }
        else {
            after->right = newcode;
        }
        return root;
    }
};

算法思想:

1. 如果根节点为空,则直接创建一个新节点,并将其作为根节点返回。

2. 否则,从根节点开始遍历二叉搜索树,找到合适的插入位置。

3. 如果待插入的值小于当前节点的值,则将当前节点的左子树作为新的当前节点,继续遍历。

4. 如果待插入的值大于当前节点的值,则将当前节点的右子树作为新的当前节点,继续遍历。

5. 当遍历到叶子节点时,将新节点插入到当前节点的左子树或右子树中。

时间复杂度:

最坏情况下,需要遍历整个二叉搜索树,时间复杂度为O(n),其中n为二叉搜索树的节点数。

空间复杂度:

最坏情况下,递归调用栈的深度为二叉搜索树的高度,空间复杂度为O(logn),其中n为二叉搜索树的节点数。