文章目录
701. 二叉搜索树中的插入操作
题目:
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
示例 1:
输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9H6Uzd1f-1677051162781)(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;
}