sysy-data/hidden_functional_c/sy/11_BST.sy

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;
}