ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二叉排序树(BST) 的插入,删除,查询

2021-08-09 16:31:34  阅读:158  来源: 互联网

标签:NULL val BST 二叉 int else 排序 root left


你需要写一种数据结构,来维护一些数,其中需要提供以下操作:

插入数值 x。
删除数值 x。
输出数值 x 的前驱(前驱定义为现有所有数中小于 x 的最大的数)。
输出数值 x 的后继(后继定义为现有所有数中大于 x 的最小的数)。

题目保证:

操作 1 插入的数值各不相同。
操作 2 删除的数值一定存在。
操作 3 和 4 的结果一定存在。

输入格式
第一行包含整数 n,表示共有 n 个操作命令。
接下来 n 行,每行包含两个整数 opt 和 x,表示操作序号和操作数值。


对于操作 3,4,每行输出一个操作结果。

数据范围
1≤n≤2000,
−10000≤x≤10000

#include<bits/stdc++.h>

using namespace std;

const int INT=1e8;//定义查询前驱和后继时的边界,因为max与min里左子树右子树可能不存在

struct TreeNode
{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int _val) : val(_val),left(NULL),right(NULL) {}
}*root;
//因为要改变节点的值要加  &引用符号
void insert(TreeNode* &root,int x)
{
    if(root==NULL)//如果为空才新建一个点
    root = new TreeNode(x);
    else if(root->val>x)//如果root的值大于x,插在左子树里
    insert(root->left,x);
    else
    insert(root->right,x);//否则插右子树里
}

void remove(TreeNode* &root,int x)//删除节点,三种情况,是叶节点,有一个左儿子或者右儿子,有左子树且有右子树
{
    if(root==NULL) return;
    if(root->val>x) remove(root->left,x);//如果根节点的值大于x,去左子树删x
    else if(root->val<x) remove(root->right,x);//否则去右子树删除
    else
    {
        if(root->left==NULL&&root->right==NULL)//如果x为叶节点,直接令其为空
            root=NULL;
        else if(root->left==NULL)//如果只有右儿子
            root=root->right;
        else if(root->right==NULL)//如果只有左儿子
            root=root->left;
        else
        {
            auto p = root->left;//当删除的点只有一个左儿子,且左儿子没有右儿子时,删除点的前驱就是roo->left
            while(p->right!=NULL) p = p->right;//如果p还有右儿子,则删除点的前驱就是这个p的右儿子,即p->right
            root->val=p->val;//将前驱的值赋值给要删除点的值
            remove(root->left, p->val);//删除这个前驱
        }
    }
}

int get_pre(TreeNode* root,int x)//输出X的前驱(前驱定义为现有所有数中小于 x 的最大的数)
{
    if(root==NULL)  return -INT;
    if(root->val>=x) return get_pre(root->left,x);//如果根节点的值小大于等于x,则在左子树里去找符合的值
    else
        return max(root->val,get_pre(root->right,x));//如果根节点的值小于x,则小于x的最大值有可能是根节点的值,也有可能是右子树里符合的值
}

int get_suc(TreeNode* root,int x)//输出x的后继(后继定义为现有所有数中大于 x 的最小的数)
{
    if(root==NULL) return INT;//如果根节点为空
    if(root->val<=x) return get_suc(root->right,x);//如果根节点的值小于等于x,则在右子树里去找符合的值
    else 
        return min(root->val,get_suc(root->left,x));//如果根节点的值大于x,则大于x的最小值有可能是根节点的值,也有可能是左子树里符合的值
}


int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int t,x;
        cin>>t>>x;
        if(t==1) insert(root,x);
        else if(t==2) remove(root,x);
        else if(t==3) cout<<get_pre(root, x)<<endl;
        else cout<<get_suc(root, x)<<endl;
    }
    
    return 0;
}

标签:NULL,val,BST,二叉,int,else,排序,root,left
来源: https://www.cnblogs.com/ylsunlight/p/15119305.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有