你需要写一种数据结构,来维护一些数,其中需要提供以下操作:
- 插入数值
x
。 - 删除数值
x
。 - 输出数值
x
的前驱(前驱定义为现有所有数中小于 x
的最大的数)。 - 输出数值
x
的后继(后继定义为现有所有数中大于 x
的最小的数)。
题目保证:
- 操作
1
插入的数值各不相同。 - 操作
2
删除的数值一定存在。 - 操作
3
和 4
的结果一定存在。
输入格式
第一行包含整数 n
,表示共有 n
个操作命令。
接下来 n
行,每行包含两个整数 opt
和 x
,表示操作序号和操作数值。
输出格式
对于操作 3,4
,每行输出一个操作结果。
数据范围
1 < n < 2000
,
-10000 < x < 10000
输入样例:
1 2 3 4 5 6 7
| 6 1 1 1 3 1 5 3 4 2 3 4 2
|
输出样例:
算法思想
略. 详细看代码注释
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include <iostream>
using namespace std;
const int INF = 0x3f3f3f3f;
struct TreeNode{ int val; TreeNode * left, * right; TreeNode(int _val) : val(_val), left(NULL), right(NULL){} };
void insertNode(TreeNode *& root, int x){ if(!root) root = new TreeNode(x); else if(x < root -> val) insertNode(root -> left, x); else insertNode(root -> right, x); }
void deleteNode(TreeNode *& root, int x){ if(!root) return; else if(x < root -> val) deleteNode(root -> left, x); else if(x > root -> val) deleteNode(root -> right, x); else{ if(!root -> left && !root -> right) delete root, root = NULL; else if(!root -> right) root = root -> left; else if(!root -> left) root = root -> right; else{ TreeNode * p = root -> left; while(p -> right) p = p -> right; root -> val = p -> val; deleteNode(root -> left, p -> val); } } }
int findPre(TreeNode * root, int x){ if(!root) return -INF; if(root -> val >= x) return findPre(root -> left, x); return max(root -> val, findPre(root -> right, x)); }
int findSuc(TreeNode * root, int x){ if(!root) return INF; if(root -> val <= x) return findSuc(root -> right, x); return min(root -> val, findSuc(root -> left, x)); }
int main(){ int n; cin >> n; TreeNode * root; while(n --){ int op, x; cin >> op >> x; if(op == 1){ insertNode(root, x); }else if(op == 2){ deleteNode(root, x); }else if(op == 3){ cout << findPre(root, x) << endl; }else if(op == 4){ cout << findSuc(root, x) << endl; } } return 0; }
|