二叉树——二叉搜索树中的插入操作

文章介绍了如何在二叉搜索树中进行插入操作,通过比较插入值与当前节点值来决定插入位置,保证树的二叉搜索性质。插入时,如果当前节点为空,则创建新节点;否则,若值大于当前节点值,插入到右子树,反之插入到左子树。文章指出代码中存在改进点,避免了不必要的重复插入。
摘要由CSDN通过智能技术生成

二叉搜索树中的插入操作

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

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

示例 1:

在这里插入图片描述

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

提示:

树中的节点数将在 [0, 104]的范围内。
-108 <= Node.val <= 108
所有值 Node.val 是 独一无二 的。
-108 <= val <= 108
保证 val 在原始BST中不存在。

思路

搜索树插入,永远都是插到空节点处,不可能拆掉已有节点换上,比当前节点小就放左边,大就放右边,递归下去

  • 终止条件
    到了空节点处,插入这里
        if(root==NULL) {
            TreeNode* node=new TreeNode(val);
            return node;
        }

这里是root比目标值小,插入右边子树

        if(root->val<val){
            TreeNode* right=insertIntoBST(root->right,val);
            root->right=right;
        }
class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root==NULL) {
            TreeNode* node=new TreeNode(val);
            return node;
        }
        if(root->val<val){
            TreeNode* right=insertIntoBST(root->right,val);
            root->right=right;
        }
        if(root->val>val){
            TreeNode* left=insertIntoBST(root->left,val);
            root->left=left;
        }
        return root;
    }
};

代改进点

        if(root->val<val){
            TreeNode* right=insertIntoBST(root->right,val);
            root->right=right;
        }

把插入放入递归函数下面,造成每次递归回调后都会进行一次插入
第一次是将插入值5插入,第二次则是返回当前函数节点 7重新成为节点 4 的右节点(7本来就是4的右节点,重复操作)
除了第一次插入操作有效,其他插入操作为冗余操作
在这里插入图片描述

二叉搜索树,也叫二查找(BST,Binary Search Tree),是一种特殊的二叉树。相对于普通的二叉树,它有一个特点:所有左子的节点都比根节点小,所有右子的节点都比根节点大。因此,它可以快速地进行查找、插入、删除等操作。 具体来说,二叉搜索树的定义如下: - 节点的左子所有节点的值都小于该节点的值。 - 节点的右子所有节点的值都大于该节点的值。 - 左右子也都是二叉搜索树。 如下图所示,就是一个二叉搜索树的例子: ``` 8 / \ 3 10 / \ \ 1 6 14 / \ / 4 7 13 ``` 在这个,每个节点都满足左子的节点值小于该节点的值,右子的节点值大于该节点的值。比如,节点 3 的左子是 1 和 6,右子是 4 和 7,都满足要求。 二叉搜索树的主要操作包括查找、插入和删除。 查找操作可以通过递归或者循环实现。递归实现如下: ``` def search(root, val): if not root or root.val == val: return root if root.val > val: return search(root.left, val) else: return search(root.right, val) ``` 插入操作需要先查找到插入的位置,然后创建一个新节点插入到该位置: ``` def insert(root, val): if not root: return TreeNode(val) if root.val > val: root.left = insert(root.left, val) else: root.right = insert(root.right, val) return root ``` 删除操作比较复杂,需要考虑多种情况。如果要删除的节点只有一个子节点,直接将其子节点替换上来即可。如果要删除的节点有两个子节点,可以找到其右子的最小节点(或者左子的最大节点)来替换该节点,然后再删除该最小节点(或者最大节点)。 ``` def delete(root, val): if not root: return None if root.val == val: if not root.left: return root.right elif not root.right: return root.left else: # 找到右子的最小节点 p = root.right while p.left: p = p.left root.val = p.val root.right = delete(root.right, p.val) elif root.val > val: root.left = delete(root.left, val) else: root.right = delete(root.right, val) return root ``` 需要注意的是,在删除节点时,要保证删除后的仍然是二叉搜索树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值