#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int value;
struct node *left;
struct node *right;
} Node;
Node *
newNode(int n){
Node *obj;
obj
= (Node
*)malloc(sizeof(Node
)); obj->value = n;
obj->left = NULL;
obj->right = NULL;
return obj;
}
Node *
addNode(Node *obj, int n){
if(obj == NULL){
return newNode(n);
}
if(obj->value == n){
/*do nothing*/
}else if(obj->value < n){
obj->right = addNode(obj->right, n);
} else{
obj->left = addNode(obj->left, n);/* (6) */
}
return obj;
}
Node *
appendRightEnd(Node *obj, Node *right){
if(obj != NULL){
if(obj->right == NULL){
obj->right = right;
}else{
obj->right = appendRightEnd(obj->left, obj->left->right)/* (7) */;
}
}
return obj;
}
Node *
deleteNode(Node *obj, int n){
Node *newobj;
if(obj != NULL){
if(obj->value == n){
if (obj->left == NULL){
newobj = obj->right;
return newobj;
}else if(obj->right == NULL){
newobj = obj->left;/* (8) */
return newobj;
}else{
obj->left = appendRightEnd(obj->left, obj->right);
newobj = obj->left;
return newobj;
}
}else{
if(obj->value < n)
obj->right = deleteNode(obj->right, n);
else
obj->left = deleteNode(obj->left, n);/* (9) */
}
}
return obj;
}
void
printNodes(Node *obj){
if(obj != NULL){
if(obj->left != NULL){
printNodes(obj->left);
}
if(obj->right != NULL){
printNodes(obj->right);
}
}
}
int
main(int argc, char *argv[]){
Node *topnode = NULL;
topnode = addNode(topnode, 5);
topnode = addNode(topnode, 7);
topnode = addNode(topnode, 1);
topnode = addNode(topnode, -1);
topnode = addNode(topnode, 4);
topnode = addNode(topnode, 10);
printNodes(topnode);
topnode = deleteNode(topnode, 5);
printNodes(topnode);
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+Cgp0eXBlZGVmIHN0cnVjdCBub2RlIHsKICBpbnQgdmFsdWU7CiAgc3RydWN0IG5vZGUgKmxlZnQ7CiAgc3RydWN0IG5vZGUgKnJpZ2h0Owp9IE5vZGU7CgpOb2RlICoKbmV3Tm9kZShpbnQgbil7CiAgTm9kZSAqb2JqOwogIG9iaiA9IChOb2RlICopbWFsbG9jKHNpemVvZihOb2RlKSk7CiAgb2JqLT52YWx1ZSA9IG47CiAgb2JqLT5sZWZ0ID0gTlVMTDsKICBvYmotPnJpZ2h0ID0gTlVMTDsKICByZXR1cm4gb2JqOwp9CgpOb2RlICoKYWRkTm9kZShOb2RlICpvYmosIGludCBuKXsKICBpZihvYmogPT0gTlVMTCl7CiAgICByZXR1cm4gbmV3Tm9kZShuKTsKICB9CgogIGlmKG9iai0+dmFsdWUgPT0gbil7CiAgICAvKmRvIG5vdGhpbmcqLwogIH1lbHNlIGlmKG9iai0+dmFsdWUgPCBuKXsKICAgIG9iai0+cmlnaHQgPSBhZGROb2RlKG9iai0+cmlnaHQsIG4pOwogIH0gZWxzZXsKICAgIG9iai0+bGVmdCA9IGFkZE5vZGUob2JqLT5sZWZ0LCBuKTsvKiAgICg2KSAgICovCiAgfQoKICByZXR1cm4gb2JqOwp9CgoKTm9kZSAqCmFwcGVuZFJpZ2h0RW5kKE5vZGUgKm9iaiwgTm9kZSAqcmlnaHQpewogIGlmKG9iaiAhPSBOVUxMKXsKICAgIGlmKG9iai0+cmlnaHQgPT0gTlVMTCl7CiAgICAgIG9iai0+cmlnaHQgPSByaWdodDsKICAgIH1lbHNlewogICAgICBvYmotPnJpZ2h0ID0gYXBwZW5kUmlnaHRFbmQob2JqLT5sZWZ0LCBvYmotPmxlZnQtPnJpZ2h0KS8qICAgKDcpICAgKi87CiAgICB9CiAgfQogIHJldHVybiBvYmo7Cn0KCgpOb2RlICoKZGVsZXRlTm9kZShOb2RlICpvYmosIGludCBuKXsKICBOb2RlICpuZXdvYmo7CgogIGlmKG9iaiAhPSBOVUxMKXsKICAgIGlmKG9iai0+dmFsdWUgPT0gbil7CgogICAgICBpZiAob2JqLT5sZWZ0ID09IE5VTEwpewoJbmV3b2JqID0gb2JqLT5yaWdodDsKCWZyZWUob2JqKTsKCXJldHVybiBuZXdvYmo7CiAgICAgIH1lbHNlIGlmKG9iai0+cmlnaHQgPT0gTlVMTCl7CgluZXdvYmogPSBvYmotPmxlZnQ7LyogICAoOCkgICAqLwoJZnJlZShvYmopOwoJcmV0dXJuIG5ld29iajsKICAgICAgfWVsc2V7CgoJb2JqLT5sZWZ0ID0gYXBwZW5kUmlnaHRFbmQob2JqLT5sZWZ0LCBvYmotPnJpZ2h0KTsKCW5ld29iaiA9IG9iai0+bGVmdDsKCWZyZWUob2JqKTsKCXJldHVybiBuZXdvYmo7CiAgICAgIH0KICAgIH1lbHNlewogICAgICBpZihvYmotPnZhbHVlIDwgbikKCW9iai0+cmlnaHQgPSBkZWxldGVOb2RlKG9iai0+cmlnaHQsIG4pOwogICAgICBlbHNlCglvYmotPmxlZnQgPSBkZWxldGVOb2RlKG9iai0+bGVmdCwgbik7LyogICAoOSkgICAqLwogICAgfQogIH0KICByZXR1cm4gb2JqOwp9CgoKdm9pZApwcmludE5vZGVzKE5vZGUgKm9iail7CiAgaWYob2JqICE9IE5VTEwpewogICAgaWYob2JqLT5sZWZ0ICE9IE5VTEwpewogICAgICBwcmludE5vZGVzKG9iai0+bGVmdCk7CiAgICB9CgogICAgcHJpbnRmKCIlZFx0Iiwgb2JqLT52YWx1ZSk7CgogICAgaWYob2JqLT5yaWdodCAhPSBOVUxMKXsKICAgICAgcHJpbnROb2RlcyhvYmotPnJpZ2h0KTsKICAgIH0KICB9Cgp9CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKXsKICBOb2RlICp0b3Bub2RlID0gTlVMTDsKCiAgdG9wbm9kZSA9IGFkZE5vZGUodG9wbm9kZSwgNSk7CiAgdG9wbm9kZSA9IGFkZE5vZGUodG9wbm9kZSwgNyk7CiAgdG9wbm9kZSA9IGFkZE5vZGUodG9wbm9kZSwgMSk7CiAgdG9wbm9kZSA9IGFkZE5vZGUodG9wbm9kZSwgLTEpOwogIHRvcG5vZGUgPSBhZGROb2RlKHRvcG5vZGUsIDQpOwogIHRvcG5vZGUgPSBhZGROb2RlKHRvcG5vZGUsIDEwKTsKCiAgcHJpbnROb2Rlcyh0b3Bub2RlKTsKICBwcmludGYoIlxuIik7CiAgdG9wbm9kZSA9IGRlbGV0ZU5vZGUodG9wbm9kZSwgNSk7CgogIHByaW50Tm9kZXModG9wbm9kZSk7CiAgcHJpbnRmKCJcbiIpOwp9