typedef int E;
struct TreeNode {
E element;
struct TreeNode *left;
struct TreeNode *right;
};
typedef struct TreeNode *Node;
Node createNode(E element) {
Node node = malloc(sizeof(struct TreeNode));
if (node == NULL) return NULL;
node->left = node->right = NULL;
node->element = element;
return node;
}
void preOrder(Node root) {
if (root == NULL) return;
preOrder(root->left);
printf("%d ", root->element);
preOrder(root->right);
}
void insert(Node root, E element) {
while (root) {
if (root->element == element) return;
if (root->element > element) {
if (root->left)
root = root->left;
else {
Node node = createNode(element);
root->left = node;
return;
}
} else {
if (root->right)
root = root->right;
else {
Node node = createNode(element);
root->right = node;
return;
}
}
}
}
Node insert2(Node root, E element) {
if (root == NULL) return createNode(element);
if (root->element > element) {
root->left = insert2(root->left, element);
} else if (root->element < element) {
root->right = insert2(root->right, element);
}
return root;
}
int find(Node root, E target) {
if (root == NULL) return -1;
if (root->element == target) return root->element;
if (root->element > target)
find(root->left, target);
else find(root->right, target);
}
Node findMax(Node root) {
if (root->right == NULL) return root;
findMax(root->right);
}
Node delete(Node root, E target) {
if (root == NULL) return NULL;
if (root->element > target)
root->left = delete(root->left, target);
else if (root->element < target)
root->right = delete(root->right, target);
else {
if (root->right && root->left) {
Node Max = findMax(root->left);
root->element = Max->element;
root->left = delete(root->left, root->element);
} else {
Node tmp = root;
if (root->right)
root = root->right;
else
root = root->left;
free(tmp);
}
}
return root;
}
int main() {
Node root = insert2(NULL, 18);
insert2(root, 10);
insert2(root, 20);
insert2(root, 7);
insert2(root, 5);
insert2(root, 22);
insert2(root, 9);
preOrder(root);
printf("\n");
delete(root, 9);
preOrder(root);
}