701. 二叉搜索树中的插入操作(自己写的题解,方便自己回忆复习)

文章介绍了如何在二叉搜索树中进行插入操作,通过遍历找到合适的位置并创建新节点。代码示例展示了当给定一个BST的根节点和要插入的值时,如何保持树的二叉搜索树特性。方法是根据节点值的大小关系决定向左子树还是右子树遍历,直到找到空位插入新节点。
摘要由CSDN通过智能技术生成

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

题目:

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

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

示例 1:

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wctpbCBW-1677137649514)(en-resource://database/608:1)]

示例 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]

力扣链接

思路

运用遍历(循环)找到数值插入位置

因为二叉搜索树的特性,左孩子小于父节点,右孩子大于父节点,所以我们只需要不断地判断需要插入的数值是比当前遍历到的结点大还是小,然后决定是向左子树遍历还是右子树遍历,最后直到找到可以挂上去的结点(两种情况满足:1.需要插入的数值比这个结点小,然后刚好这个结点的左子树为空 2.需要插入的数值比这个结点大,然后刚好这个结点的右子树为空),然后创建新结点(注意一定要把新建的结点的左右子树都变为空,否则可能随机产生了一大堆的子树),将数据放进去,再挂在最后找到的结点上就可以了

我的代码:


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct TreeNode* insertIntoBST(struct TreeNode* root, int val){
    struct TreeNode* now=root;//创建一个结点存放根,保证根的不变性,也方便最后返回根root(用于根不为空时的遍历)
    if(root==NULL)//当树为空时,直接将数据存在根处
    {
        struct TreeNode* new=(struct TreeNode*)malloc(sizeof(struct TreeNode));//创建结点
        new->val=val;
        new->left=NULL;
        new->right=NULL;//保证左右子树为空,避免产生自带的无穷子树
        root=new;
    }
    while(now!=NULL)
    {
        if(now->val<val)//当需要插入的数据比当前结点存的数据大时,说明要继续向该结点的右子树遍历搜索
        {
            if(now->right==NULL)//遍历到右子树为空时,将数据插入到这个右结点处
            {
                struct TreeNode* new=(struct TreeNode*)malloc(sizeof(struct TreeNode));
                new->val=val;
                now->right=new;
                new->left=NULL;
                new->right=NULL;
                break;
            }
            else
            {
                now=now->right;//当右子树不为空时,让now=右子树
            }
        }
        else//当需要插入的数据比当前结点存的数据小时,情况和上述类似
        {
            if(now->left==NULL)
            {
                struct TreeNode* new=(struct TreeNode*)malloc(sizeof(struct TreeNode));
                new->val=val;
                now->left=new;
                new->left=NULL;
                new->right=NULL;
                break;
            }
            else
            {
                now=now->left;
            }
        }
    }
    return root;//最后返回根root;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值