【个人笔记】BST(Binary Search Tree)二叉搜索树代码模板
#include <bits/stdc++.h>
#define endl '\n'using namespace std;const int INF = 0x7fffffff;
const double EPS = 1e-8;
const int N = 1e4 + 5;struct node {int left;int right;int value;int cnt;int siz;
} tree[N];int q, ncnt;void add(int x, int root) {tree[root].siz++;if (tree[root].value == x) {tree[root].cnt++;return;}if (x < tree[root].value) {if (tree[root].left) {add(x, tree[root].left);} else {tree[++ncnt].value = x;tree[ncnt].siz = tree[ncnt].cnt = 1;tree[root].left = ncnt;}} else {if (tree[root].right) {add(x, tree[root].right);} else {tree[++ncnt].value = x;tree[ncnt].siz = tree[ncnt].cnt = 1;tree[root].right = ncnt;}}
}int pre(int x, int root, int ans) {if (tree[root].value >= x) {if (tree[root].left) {return pre(x, tree[root].left, ans);} else {return ans;}} else {if (!tree[root].right) {return (tree[root].value < x) ? tree[root].value : ans;}if (tree[root].cnt != 0) {return pre(x, tree[root].right, tree[root].value);} else {return pre(x, tree[root].right, ans);}}
}int post(int x, int root, int ans) {if (tree[root].value <= x) {if (tree[root].right)return post(x, tree[root].right, ans);elsereturn ans;} else {if (!tree[root].left) {return (tree[root].value > x) ? tree[root].value : ans;}if (tree[root].cnt != 0) {return post(x, tree[root].left, tree[root].value);} else {return post(x, tree[root].left, ans);}}
}int rk(int x, int root) {if (root == 0)return 0;if (x == tree[root].value)return tree[tree[root].left].siz;if (x < tree[root].value)return rk(x, tree[root].left);elsereturn rk(x, tree[root].right) + tree[tree[root].left].siz +tree[root].cnt;
}int kth(int x, int root) {if (root == 0)return INF;if (tree[tree[root].left].siz >= x) {return kth(x, tree[root].left);}if (tree[tree[root].left].siz + tree[root].cnt >= x) {return tree[root].value;}return kth(x - tree[tree[root].left].siz - tree[root].cnt,tree[root].right);
}int main() {cin >> q;while (q--) {int op, x;cin >> op >> x;switch (op) {case 1:cout << rk(x, 1) + 1 << endl;break;case 2:cout << kth(x, 1) << endl;break;case 3:cout << pre(x, 1, -INF) << endl;break;case 4:cout << post(x, 1, INF) << endl;break;case 5:if (ncnt == 0) {ncnt++;tree[ncnt].value = x;tree[ncnt].cnt = tree[ncnt].siz = 1;} elseadd(x, 1);break;default:break;}}return 0;
}