97 lines
2.0 KiB
Plaintext
97 lines
2.0 KiB
Plaintext
#include "sylib.h"
|
|
#define space 32
|
|
#define LF 10
|
|
#define maxNode 10000
|
|
int value[maxNode];
|
|
int left_child[maxNode];
|
|
int right_child[maxNode];
|
|
int now;
|
|
|
|
int search(int root, int x) {
|
|
if (root == -1 || value[root] == x)
|
|
return root;
|
|
else if (x > value[root])
|
|
return search(right_child[root], x);
|
|
else
|
|
return search(left_child[root], x);
|
|
}
|
|
|
|
int find_minimum(int root) {
|
|
if (root == -1) {
|
|
return -1;
|
|
}
|
|
else if (left_child[root] != -1) {
|
|
return find_minimum(left_child[root]);
|
|
}
|
|
return root;
|
|
}
|
|
|
|
int new_node(int x) {
|
|
value[now] = x;
|
|
left_child[now] = -1;
|
|
right_child[now] = -1;
|
|
now = now + 1;
|
|
return now - 1;
|
|
}
|
|
|
|
int insert(int root, int x) {
|
|
if (root == -1) {
|
|
return new_node(x);
|
|
}
|
|
else if (x > value[root])
|
|
right_child[root] = insert(right_child[root], x);
|
|
else {
|
|
left_child[root] = insert(left_child[root], x);
|
|
}
|
|
return root;
|
|
}
|
|
|
|
int delete(int root, int x) {
|
|
if (root == -1) return -1;
|
|
if (x > value[root]) right_child[root] = delete(right_child[root], x);
|
|
else if (x < value[root]) left_child[root] = delete(left_child[root], x);
|
|
else
|
|
if (left_child[root] == -1 && right_child[root] == -1) return -1;
|
|
else if (left_child[root] == -1 || right_child[root] == -1)
|
|
if(left_child[root] == -1)
|
|
return right_child[root];
|
|
else
|
|
return left_child[root];
|
|
else {
|
|
int tmp = find_minimum(right_child[root]);
|
|
value[root] = value[tmp];
|
|
right_child[root] = delete(right_child[root], value[tmp]);
|
|
}
|
|
return root;
|
|
}
|
|
|
|
void inorder(int root) {
|
|
if (root != -1) {
|
|
inorder(left_child[root]);
|
|
putint(value[root]);
|
|
putch(space);
|
|
inorder(right_child[root]);
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
now = 0;
|
|
int n = getint();
|
|
if (!n) return 0;
|
|
int root = new_node(getint()), i = 1;
|
|
while (i < n) {
|
|
insert(root, getint());
|
|
i = i + 1;
|
|
}
|
|
inorder(root);
|
|
putch(LF);
|
|
n = getint(); i = 0;
|
|
while (i < n) {
|
|
root = delete(root, getint());
|
|
i = i + 1;
|
|
}
|
|
inorder(root);
|
|
putch(LF);
|
|
return 0;
|
|
}
|