首页 > 其他分享 >29_二叉搜索树中的插入操作

29_二叉搜索树中的插入操作

时间:2024-01-18 20:34:07浏览次数:21  
标签:TreeNode val 树中 29 二叉 null root 节点

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

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果

示例 1:

img

输入: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]

【思路】

递归

递归三部曲:

  • 确定递归函数参数以及返回值

    TreeNode insertIntoBST(TreeNode root, int val);
    
  • 确定终止条件

    终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回,代码如下:

    if (root == null) 
    	return new TreeNode(val);
    
  • 确定单层递归的逻辑

    if (root.val > val) {
    	root.left = insertInToBST(root.left, val);
    }
    if (root.val < val) {
    	root.right = insertIntoBST(root.right, val);
    }
    return root;
    

    总结

    首先在二叉搜索树中的插入操作,大家不用恐惧其重构搜索树,其实根本不用重构。

    然后在递归中,我们重点讲了如何通过递归函数的返回值完成新加入节点和其父节点的赋值操作,并强调了搜索树的有序性。

    最后依然给出了迭代的方法,迭代的方法就需要记录当前遍历节点的父节点了,这个和没有返回值的递归函数实现的代码逻辑是一样的。

    class Solution {
        public TreeNode insertIntoBST(TreeNode root, int val) {
            if (root == null) return new TreeNode(val);
            TreeNode newRoot = root;
            TreeNode pre = root;
            while (root != null) {
                pre = root;
                if (root.val > val) {
                    root = root.left;
                } else if (root.val < val) {
                    root = root.right;
                } 
            }
            if (pre.val > val) {
                pre.left = new TreeNode(val);
            } else {
                pre.right = new TreeNode(val);
            }
    
            return newRoot;
        }
    }
    

    递归法

    class Solution {
        public TreeNode insertIntoBST(TreeNode root, int val) {
            if (root == null) // 如果当前节点为空,也就意味着val找到了合适的位置,此时创建节点直接返回。
                return new TreeNode(val);
                
            if (root.val < val){
                root.right = insertIntoBST(root.right, val); // 递归创建右子树
            }else if (root.val > val){
                root.left = insertIntoBST(root.left, val); // 递归创建左子树
            }
            return root;
        }
    }
    

标签:TreeNode,val,树中,29,二叉,null,root,节点
From: https://www.cnblogs.com/codingbao/p/17973360

相关文章

  • 首次公开发声,OpenAI CEO 奥特曼回忆“宫斗门”丨 RTE 开发者日报 Vol.129
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观......
  • [大数据/标准] 《GB/T 35295》信息技术 大数据 术语
    0序0.1国标基本信息国家标准《信息技术大数据术语》由TC28(全国信息技术标准化技术委员会)归口,主管部门为国家标准化管理委员会。主要起草单位中国电子技术标准化研究院 、浪潮软件集团有限公司 、浪潮(北京)电子信息产业有限公司 、国家信息中心 、华为技术有限公......
  • 代码随想录 day22 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树
    二叉搜索树的最近公共祖先这题跟之前的不一样可以利用二叉搜索树有序的特点有序就说明可以根据节点的值与pq的关系判断应该往左边搜索还是右边搜索这题显然是不需要遍历整棵树的所以是写的遍历边的写法遍历树需要用变量接受二叉搜索树中的插入操作一开始还以为要遍历......
  • 二叉树结构与递归实现前中后序遍历
    1.二叉树结构2.二叉树节点遍历顺序前序:每颗子树以中—》左—》右遍历ABDEHCFG 中序:每颗子树以左 —》中—》右遍历DBEHAFCG 后序:每颗子树以左 —》右—》中遍历DHEBFGCA 代码实现:publicclassBinaryTree{stat......
  • 二叉树的公共祖先
    最开始做的时候,就先想到的是找父节点的那个函数,于是先把目标节点的所以祖先节点存起来,然后一个一个进行比对,当然这样耗时很大。点击查看代码classSolution{public:vector<TreeNode*>vp,vq;TreeNode*findfa(TreeNode*root,TreeNode*k){if(!root){returnNULL;}if(ro......
  • 验证二叉搜索树
    首先要明白二叉搜索树如果按照中序遍历存放在数组就是呈现递增的形式。所以该题的框架一定是基于中序遍历的形式。但我最开始写的时候忽略了一个点,if(root->left->val>=root->val){returnfalse;}if(root->right->val<=root->val){returnfalse;}这样每个二叉树单独看都可以......
  • Bzoj3829. FarmCraft
     Descriptionmhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子。mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒软件,第i个妹子安装时间为Ci。树上的每条边mhy能且仅能走两次,每次耗费1单位时间。mhy送完所有电脑后会回自己家里......
  • 代码随想录 day21 二叉搜索树的最小绝对差 二叉搜索树中的众数 二叉树的最近公共祖先
    二叉搜索树的最小绝对差二叉搜索树就是有序数组那么转换一下就很简单了也可以直接在遍历二叉搜索树的时候进行比较需要一个指针记录前一个节点二叉搜索树中的众数既可以把这题的二叉搜索树当成一般树来做这样就是层序遍历树然后用map记录频率再取频率最高的值这里用......
  • 29. 定语从句-定语从句
    定语从句_定语从句的位置——从句修饰名词一定在名词后定语从句的构成——名词(先行词)+引导词+句子 复习名词性从句分类——名词性从句按照句子类型分类;共分3类;陈述句that 2.一般疑问句wether_3特殊疑问句特殊疑问词 定语从句的引导词按照什么分类?——按照先行词的......
  • 关于二叉树递归代码的粗鄙理解
    整体来看,二叉树的递归代码,可以分为终止条件,单层递归逻辑。单层递归逻辑就是所谓的根左右那三种,选哪一种也是有讲究的,如果不需要对根节点进行处理,那三种都可以。如果题目侧重与由子节点推到父节点,就采用后序遍历。如果题目侧重与由父节点推到子节点,就采用前序遍历。终止条件怎......