首页 > 其他分享 >二叉树搜索树 洛谷P5076

二叉树搜索树 洛谷P5076

时间:2024-05-24 16:40:15浏览次数:23  
标签:right 洛谷 int P5076 num 二叉树 left root size

洛谷P1827

#include<bits/stdc++.h>
using namespace std;
int n, root, cnt, opt, x;
struct node{
    int value, left, right, size, num;
    node(int l, int r, int s, int v): left(l), right(r), size(s), value(v), num(1) {}
    node() {}
}t[10010];

void update(int root) {
    t[root].size = t[t[root].left].size + t[t[root].right].size + t[root].num;
}
int rk (int x, int root) {
    if (root) {
        if (x < t[root].value) return rk(x, t[root].left);
        if (x > t[root].value) return rk(x, t[root].right) + t[t[root].left].size + t[root].num;
        return t[t[root].left].size + t[root].num;
    }
    return 1;
}
int kth (int x, int root) {
    if (x <= t[t[root].left].size) return kth(x, t[root].left);
    if (x <= t[t[root].left].size + t[root].num) return t[root].value;
    return kth(x - t[t[root].left].size - t[root].num, t[root].right);
}
void insert (int x, int & root) {
    if (x < t[root].value){
        if (!t[root].left) t[t[root].left = ++cnt] = node(0, 0, 1, x);
        else insert(x, t[root].left);
    }
    else if (x > t[root].value) {
        if (!t[root].right) t[t[root].right = ++cnt] = node(0, 0, 1, x);
        else insert(x, t[root].right);
    }
    else t[root].num++;
    update(root);
}

int main() {
    cin >> n;
    int num = 0;
    t[root = ++cnt] = node(0, 0, 1, 2147483647);
    while (n--) {
        cin >> opt >> x;
        num++;
        if (opt == 1) cout << rk(x, root) << endl;
        if (opt == 2) cout << kth(x, root) << endl;
        if (opt == 3) cout << kth(rk(x, root)-1, root) << endl;
        if (opt == 4) cout << kth(rk(x+1, root), root) << endl;
        if (opt == 5) {
            num--; insert(x, root);
        }
    }
}

标签:right,洛谷,int,P5076,num,二叉树,left,root,size
From: https://www.cnblogs.com/rjxq/p/18211235

相关文章

  • 代码随想录算法训练营第十五天 | 层序遍历 、226.翻转二叉树、101.对称二叉树
    层序遍历题目链接:学会二叉树的层序遍历,可以一口气打完以下十题:102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点......
  • 算法打卡 Day18(二叉树)-层序遍历 + 翻转二叉树 + 对称二叉树
    文章目录层序遍历相关题目Leetcode226-翻转二叉树题目描述解题思路Leetcode101-对称二叉树题目描述解题思路层序遍历我们使用队列模拟二叉树的层序遍历。相关题目102.二叉树的层序遍历classSolution{public:vector<vector<int>>levelOrder(TreeNode......
  • 算法打卡 Day14(二叉树)-理论基础 + 递归遍历 + 迭代遍历 + 统一迭代
    文章目录理论基础满二叉树完全二叉树二叉搜索树平衡二叉搜索树二叉树的存储方式链式存储顺序存储二叉树的遍历方式二叉树的定义递归遍历leetcode144-二叉树的前序遍历leetcode145-二叉树的后序遍历leetcode94-二叉树的中序遍历迭代遍历前序遍历后序遍历中序遍历统......
  • 洛谷[普及]:P1149 [NOIP2008 提高组] 火柴棒等式
    [NOIP2008提高组]火柴棒等式感谢题目提供者CCF_NOI题目描述给你n 根火柴棍,你可以拼出多少个形如A+B=C 的等式?等式中的A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字 的拼法如图所示:注意:1.加号与等号各自需要两根火柴棍;2.如果,则......
  • 基于双向堆栈的二叉树双向迭代算法
    前言之前一直在研究avl树的迭代算法。我参考了C++标准库map的实现,发现他们在树节点上使用了parent指针+一个状态标志位的形式,去实现动态迭代。但是我不想用parent指针,因为觉得会增加调整指针的时间还有浪费存储空间。于是,在我的不屑努力下,终于,找到了一种基于堆栈实现的双向迭代......
  • 代码随想录算法训练营第第15天 | 层序遍历10道题 、226.翻转二叉树 、101. 对称二叉树
    层序遍历看完本篇可以一口气刷十道题,试一试,层序遍历并不难,大家可以很快刷了十道题。题目链接/文章讲解/视频讲解:https://programmercarl.com/0102.二叉树的层序遍历.html层序遍历,10道题,一一通过,比较简单226.翻转二叉树(优先掌握递归)这道题目一些做过的同学理解的也不够深......
  • 深度优先搜索 洛谷P1605迷宫
    深度优先搜索洛谷P1605迷宫题目描述给定一个$N\timesM$方格的迷宫,迷宫里有$T$处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方......
  • 广度优先搜索 洛谷P2895Meteor Shower S
    广度优先搜索洛谷P2895[USACO08FEB]MeteorShowerS题面翻译题目描述贝茜听说一场特别的流星雨即将到来:这些流星会撞向地球,并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑,发誓要找到一个安全的地方(一个永远不会被流星摧毁的地方)。如果将牧场放入一个直角坐标系中,贝茜......
  • 二分答案 洛谷P3853路标设置
    这个题思路和洛谷P2440有点像,建议先看P2440这个题,较简单。[TJOI2007]路标设置题目背景B市和T市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最......
  • 广度优先搜索 洛谷P1443马的遍历(bfs超时问题)
    广度优先搜索洛谷P1443这里先介绍一下广度优先搜索:广度优先搜索就是先将第一步可能的步骤全部记录,遍历过后,再将由第一步到达的第二步全部记录并遍历,直到最后全部遍历。而此题要求我们求得最少步数,广度优先就能够达到最少步数的要求,因为广度优先是先通过搜索所有可能的第n步才......