Leetcode 701 二叉搜索树中的插入操作

解题思路:

        二叉搜索树特点:中间节点大于所有左子树值,小于所有右子树值。中序遍历是严格单调增序列。

        再次明确:二叉搜索树,没有重复节点,所以新插入的值也不可能和树里元素重复。

        原因:题目限制

        插入的值,总能在叶子上找到一个合适的值插入,其不会改变原有节点的位置

        这就导致这道题不会太难,即找到一个合适的叶子,将新值变成它的左或右孩子。

解题方法:

        递归        迭代

1.递归

由于二叉搜索树的有序性,找到一个合适的叶子总是容易的,可以根据值的大小关系选择向左还是向右。

public TreeNode insertIntoBST(TreeNode root, int val) {
        //找到合适的位置
        if(root==null) return new TreeNode(val);
        //val往root的左子树找
        if(root.val>val){
            root.left=insertIntoBST(root.left,val);//将更新后的左子树重新赋值
        } else if (root.val

2.迭代

注意当root为null是,也是有返回值的——new TreeNode(val)

该题也相当于是二叉搜索树种的查找操作,不需要回溯,不需要栈来模拟递归过程。

所以则道题目用迭代也非常简单且易于理解。

public TreeNode insertIntoBST2(TreeNode root, int val) {
        TreeNode cur=root;
       while(cur!=null){
           //向左插入
           if(cur.val>val){
               if(cur.left!=null){
                   cur=cur.left;
               }else{
                   //插入
                   cur.left=new TreeNode(val);
                   break;
               }
               //向右插入
           } else if (cur.val

3.分析

时间复杂度:

        递归:O(n)

        迭代:O(n)

空间复杂度:

        递归:O(log2N)

        迭代:O(log2N)

你可能感兴趣的:(刷题训练营,算法,数据结构,leetcode)