#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct tnode {
char *key;
char *value;
struct tnode *left;
struct tnode *right;
struct tnode *parent;
} tnode;
tnode *btree_empty(){
tnode
*t
= (tnode
*)malloc(sizeof(struct tnode
)); t->key = NULL;
t->value = NULL;
t->left = NULL;
t->right = NULL;
t->parent = NULL;
return t;
}
void *btree_insert(char *key, char *val, tnode *t)
{
if (t->key == NULL){
}
else
if(t->left == NULL){
t
->left
= (tnode
*)malloc(sizeof(struct tnode
)); t->left->parent = t;
}
else
btree_insert(key, val, t->left);
else
if(t->right == NULL){
t
->right
= (tnode
*)malloc(sizeof(struct tnode
)); t->right->parent = t;
}
else
btree_insert(key, val, t->right);
}
//最小値
tnode *left_min(tnode *t){
if (t->left == NULL)
return t;
else
left_min(t->left);
}
void *btree_delete(char *key, tnode *t)
{
tnode *tnode;
if(t != NULL){
btree_delete(key, t->left);
else if(strcmp(key
, t
->key
) > 0) btree_delete(key, t->right);
else
{//このノードを消去
if(t->left == NULL && t->right == NULL){//tは末端
if(strcmp(t
->key
, t
->parent
->key
) < 0){ //tは親から見て左ノード
t->parent->left = NULL;//親からの参照をなくす
}
else{
//tは親から見て右ノード
t->parent->right = NULL;
}
}
else if(t->left != NULL && t->right == NULL){//左ノードのみ
//親子関係再設定
t->parent->left = t->left;
t->left->parent = t->parent;
}
else if(t->left == NULL && t->right != NULL){
t->parent->right = t->right;
t->right->parent = t->parent;
}
else{//子が2つ
tnode = left_min(t->right);
tnode->parent->left = NULL;
strcpy(t
->value
, tnode
->value
); }
}
}
}
tnode *btree_search(char *key, tnode *t){
if (t == NULL)
return NULL;
else
return t;
else
btree_search(key, t->left);
else
btree_search(key, t->right);
}
void btree_destroy(tnode *t){
if (t != NULL){
if (t->left != NULL)
btree_destroy(t->left);
if (t->right != NULL)
btree_destroy(t->right);
}
}
int main(void){
char *x, *key, *val;
tnode *top, *search;
x
= (char *)malloc(sizeof(char) * 100); key
= (char *)malloc(sizeof(char) * 100); val
= (char *)malloc(sizeof(char) * 100);
top = btree_empty();
while(scanf("%s", x
) != EOF
){ scanf("%s %s", key
, val
); btree_insert(key, val, top);
}
else if(strcmp(x
, "delete") == 0){ btree_delete(key, top);
}
else if(strcmp(x
,"search") == 0){ search = btree_search(key, top);
}
else if(strcmp(x
, "quit") == 0){ return 0;
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCgp0eXBlZGVmIHN0cnVjdCB0bm9kZSB7CiAgY2hhciAqa2V5OwogIGNoYXIgKnZhbHVlOwogIHN0cnVjdCB0bm9kZSAqbGVmdDsKICBzdHJ1Y3QgdG5vZGUgKnJpZ2h0OwogIHN0cnVjdCB0bm9kZSAqcGFyZW50Owp9IHRub2RlOwoKCnRub2RlICpidHJlZV9lbXB0eSgpewogIAogIHRub2RlICp0ID0gKHRub2RlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdG5vZGUpKTsKICB0LT5rZXkgPSBOVUxMOwogIHQtPnZhbHVlID0gTlVMTDsKICB0LT5sZWZ0ID0gTlVMTDsKICB0LT5yaWdodCA9IE5VTEw7CiAgdC0+cGFyZW50ID0gTlVMTDsKICAKICByZXR1cm4gdDsKfQoKdm9pZCAqYnRyZWVfaW5zZXJ0KGNoYXIgKmtleSwgY2hhciAqdmFsLCB0bm9kZSAqdCkKewogIAogIGlmICh0LT5rZXkgPT0gTlVMTCl7CiAgICBzdHJjcHkodC0+a2V5LCBrZXkpOwogICAgc3RyY3B5KHQtPnZhbHVlLCB2YWwpOwogIH0KICBlbHNlCiAgICBpZiAoc3RyY21wKGtleSwgdC0+a2V5KSA8IDApCiAgICAgIGlmKHQtPmxlZnQgPT0gTlVMTCl7Cgl0LT5sZWZ0ID0gKHRub2RlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdG5vZGUpKTsKCXN0cmNweSh0LT5sZWZ0LT5rZXksIGtleSk7CglzdHJjcHkodC0+bGVmdC0+dmFsdWUsIHZhbCk7Cgl0LT5sZWZ0LT5wYXJlbnQgPSB0OwogICAgICB9CiAgICAgIGVsc2UKCWJ0cmVlX2luc2VydChrZXksIHZhbCwgdC0+bGVmdCk7CiAgICBlbHNlCiAgICAgIGlmKHQtPnJpZ2h0ID09IE5VTEwpewoJdC0+cmlnaHQgPSAodG5vZGUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB0bm9kZSkpOwoJc3RyY3B5KHQtPnJpZ2h0LT5rZXksIGtleSk7CglzdHJjcHkodC0+cmlnaHQtPnZhbHVlLCB2YWwpOwoJdC0+cmlnaHQtPnBhcmVudCA9IHQ7CiAgICAgIH0KICAgICAgZWxzZQoJYnRyZWVfaW5zZXJ0KGtleSwgdmFsLCB0LT5yaWdodCk7Cn0KCi8v5pyA5bCP5YCkCnRub2RlICpsZWZ0X21pbih0bm9kZSAqdCl7CiAgaWYgKHQtPmxlZnQgPT0gTlVMTCkKICAgIHJldHVybiB0OwogIGVsc2UKICAgIGxlZnRfbWluKHQtPmxlZnQpOwp9CgoKdm9pZCAqYnRyZWVfZGVsZXRlKGNoYXIgKmtleSwgdG5vZGUgKnQpCnsKICB0bm9kZSAqdG5vZGU7CiAgaWYodCAhPSBOVUxMKXsKICAgIGlmKHN0cmNtcChrZXksIHQtPmtleSkgPCAwKQogICAgICBidHJlZV9kZWxldGUoa2V5LCB0LT5sZWZ0KTsKICAgIGVsc2UgaWYoc3RyY21wKGtleSwgdC0+a2V5KSA+IDApCiAgICAgIGJ0cmVlX2RlbGV0ZShrZXksIHQtPnJpZ2h0KTsKICAgIGVsc2UKICAgICAgey8v44GT44Gu44OO44O844OJ44KS5raI5Y67CglpZih0LT5sZWZ0ID09IE5VTEwgJiYgdC0+cmlnaHQgPT0gTlVMTCl7Ly9044Gv5pyr56uvCgkgIGlmKHN0cmNtcCh0LT5rZXksIHQtPnBhcmVudC0+a2V5KSA8IDApewoJICAgIC8vdOOBr+imquOBi+OCieimi+OBpuW3puODjuODvOODiQoJICAgIHQtPnBhcmVudC0+bGVmdCA9IE5VTEw7Ly/opqrjgYvjgonjga7lj4LnhafjgpLjgarjgY/jgZkKCSAgICBmcmVlKHQpOwoJICB9CgkgIGVsc2V7CgkgICAgLy9044Gv6Kaq44GL44KJ6KaL44Gm5Y+z44OO44O844OJCgkgICAgdC0+cGFyZW50LT5yaWdodCA9IE5VTEw7CgkgICAgZnJlZSh0KTsKCSAgfQoJfQoJZWxzZSBpZih0LT5sZWZ0ICE9IE5VTEwgJiYgdC0+cmlnaHQgPT0gTlVMTCl7Ly/lt6bjg47jg7zjg4njga7jgb8KCSAgLy/opqrlrZDplqLkv4Llho3oqK3lrpoKCSAgdC0+cGFyZW50LT5sZWZ0ID0gdC0+bGVmdDsKCSAgdC0+bGVmdC0+cGFyZW50ID0gdC0+cGFyZW50OwoJICBmcmVlKHQpOwoJfQoJZWxzZSBpZih0LT5sZWZ0ID09IE5VTEwgJiYgdC0+cmlnaHQgIT0gTlVMTCl7CgkgIHQtPnBhcmVudC0+cmlnaHQgPSB0LT5yaWdodDsKCSAgdC0+cmlnaHQtPnBhcmVudCA9IHQtPnBhcmVudDsKCX0KCWVsc2V7Ly/lrZDjgYwy44GkCgkgIHRub2RlID0gbGVmdF9taW4odC0+cmlnaHQpOwoJICB0bm9kZS0+cGFyZW50LT5sZWZ0ID0gTlVMTDsKCSAgc3RyY3B5KHQtPmtleSwgdG5vZGUtPmtleSk7CgkgIHN0cmNweSh0LT52YWx1ZSwgdG5vZGUtPnZhbHVlKTsKCSAgZnJlZSh0bm9kZSk7Cgl9CiAgICAgIH0KICB9Cn0KCgoKCnRub2RlICpidHJlZV9zZWFyY2goY2hhciAqa2V5LCB0bm9kZSAqdCl7CiAgCiAgaWYgKHQgPT0gTlVMTCkgCiAgICByZXR1cm4gTlVMTDsKICBlbHNlCiAgICBpZiAoc3RyY21wKGtleSwgdC0+a2V5KSA9PSAwKQogICAgICByZXR1cm4gdDsKICAgIGVsc2UgCiAgICAgIGlmIChzdHJjbXAoa2V5LCB0LT5rZXkpIDwgMCkKCWJ0cmVlX3NlYXJjaChrZXksIHQtPmxlZnQpOwogICAgICBlbHNlCglidHJlZV9zZWFyY2goa2V5LCB0LT5yaWdodCk7Cn0KCgp2b2lkIGJ0cmVlX2Rlc3Ryb3kodG5vZGUgKnQpewogIAogIGlmICh0ICE9IE5VTEwpewogICAgaWYgKHQtPmxlZnQgIT0gTlVMTCkKICAgICAgYnRyZWVfZGVzdHJveSh0LT5sZWZ0KTsKICAgIGlmICh0LT5yaWdodCAhPSBOVUxMKQogICAgICBidHJlZV9kZXN0cm95KHQtPnJpZ2h0KTsKICAgIGZyZWUodCk7CiAgfQp9CgoKaW50IG1haW4odm9pZCl7CiAgY2hhciAqeCwgKmtleSwgKnZhbDsKICB0bm9kZSAqdG9wLCAqc2VhcmNoOwogIHggPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikgKiAxMDApOwogIGtleSA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSAqIDEwMCk7CiAgdmFsID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpICogMTAwKTsKICAKICAKICB0b3AgPSBidHJlZV9lbXB0eSgpOwogIAogIHdoaWxlKHNjYW5mKCIlcyIsIHgpICE9IEVPRil7CiAgICBzY2FuZigiICIpOwogICAgaWYoc3RyY21wKHgsICJpbnNlcnQiKSA9PSAwKXsKICAgICAgc2NhbmYoIiVzICVzIiwga2V5LCB2YWwpOyAgIAogICAgICBidHJlZV9pbnNlcnQoa2V5LCB2YWwsIHRvcCk7CiAgICB9CiAgICBlbHNlIGlmKHN0cmNtcCh4LCAiZGVsZXRlIikgPT0gMCl7CiAgICAgIHNjYW5mKCIlcyIsIGtleSk7CiAgICAgIGJ0cmVlX2RlbGV0ZShrZXksIHRvcCk7CiAgICB9CiAgICBlbHNlIGlmKHN0cmNtcCh4ICwic2VhcmNoIikgPT0gMCl7CiAgICAgIHNjYW5mKCIlcyIsIGtleSk7CiAgICAgIHNlYXJjaCA9IGJ0cmVlX3NlYXJjaChrZXksIHRvcCk7CiAgICB9CiAgICBlbHNlIGlmKHN0cmNtcCh4LCAicXVpdCIpID09IDApewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIHNjYW5mKCIgIik7CiAgfQogIAogIHJldHVybiAwOwp9CgoK