#include <iostream>
#include <cstdlib>
struct Tree {
int val;
Tree* left;
Tree* right;
};
Tree* InsertNode(Tree* node, int val);
void PrintNode(std::ostream& _out, const Tree* node);
void ClearNode(Tree* node);
//удаление
Tree* DeleteNode(Tree* node, int val){
if(node == NULL)
return node;
if(val == node->val){
Tree* tmp;
if(node->right == NULL)
tmp = node->left;
else {
Tree* ptr = node->right;
if(ptr->left == NULL){
ptr->left = node->left;
tmp = ptr;
} else {
Tree* pmin = ptr->left;
while(pmin->left != NULL){
ptr = pmin;
pmin = ptr->left;
}
ptr->left = pmin->right;
pmin->left = node->left;
pmin->right = node->right;
tmp = pmin;
}
}
delete node;
return tmp;
} else if(val < node->val)
node->left = DeleteNode(node->left, val);
else
node->right = DeleteNode(node->right, val);
return node;
}
int main(void){
Tree* tree = NULL;
for(int i = 0; i < 20; ++i)
tree = InsertNode(tree, std::rand() % 10);
PrintNode(std::cout, tree);
std::cout << std::endl;
tree = DeleteNode(tree, 5);
tree = DeleteNode(tree, 2);
tree = DeleteNode(tree, 9);
PrintNode(std::cout, tree);
ClearNode(tree);
return 0;
}
//вставка
Tree* InsertNode(Tree* node, int val){
if(node == NULL){
node = new (std::nothrow) Tree();
if(node != NULL){
node->val = val;
node->left = node->right = NULL;
}
return node;
}
if(val < node->val)
node->left = InsertNode(node->left, val);
else
node->right = InsertNode(node->right, val);
return node;
}
//печать
void PrintNode(std::ostream& _out, const Tree* node){
if(node != NULL){
if(node->left != NULL)
PrintNode(_out, node->left);
_out << node->val << ' ';
if(node->right != NULL)
PrintNode(_out, node->right);
}
}
//удаление всего
void ClearNode(Tree* node){
if(node != NULL){
if(node->left != NULL)
ClearNode(node->left);
if(node->right != NULL)
ClearNode(node->right);
delete node;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCnN0cnVjdCBUcmVlIHsKCWludCAgIHZhbDsKCVRyZWUqIGxlZnQ7CglUcmVlKiByaWdodDsKfTsKClRyZWUqIEluc2VydE5vZGUoVHJlZSogbm9kZSwgaW50IHZhbCk7CnZvaWQgIFByaW50Tm9kZShzdGQ6Om9zdHJlYW0mIF9vdXQsIGNvbnN0IFRyZWUqIG5vZGUpOwp2b2lkICBDbGVhck5vZGUoVHJlZSogbm9kZSk7CgoKLy/Rg9C00LDQu9C10L3QuNC1ClRyZWUqIERlbGV0ZU5vZGUoVHJlZSogbm9kZSwgaW50IHZhbCl7CglpZihub2RlID09IE5VTEwpCgkJcmV0dXJuIG5vZGU7CgoJaWYodmFsID09IG5vZGUtPnZhbCl7CgoJCVRyZWUqIHRtcDsKCQlpZihub2RlLT5yaWdodCA9PSBOVUxMKQoJCQl0bXAgPSBub2RlLT5sZWZ0OwoJCWVsc2UgewoKCQkJVHJlZSogcHRyID0gbm9kZS0+cmlnaHQ7CgkJCWlmKHB0ci0+bGVmdCA9PSBOVUxMKXsKCQkJCXB0ci0+bGVmdCA9IG5vZGUtPmxlZnQ7CgkJCQl0bXAgPSBwdHI7CgkJCX0gZWxzZSB7CgoJCQkJVHJlZSogcG1pbiA9IHB0ci0+bGVmdDsKCQkJCXdoaWxlKHBtaW4tPmxlZnQgIT0gTlVMTCl7CgkJCQkJcHRyICA9IHBtaW47CgkJCQkJcG1pbiA9IHB0ci0+bGVmdDsKCQkJCX0KCQkJCXB0ci0+bGVmdCAgID0gcG1pbi0+cmlnaHQ7CgkJCQlwbWluLT5sZWZ0ICA9IG5vZGUtPmxlZnQ7CgkJCQlwbWluLT5yaWdodCA9IG5vZGUtPnJpZ2h0OwoJCQkJdG1wID0gcG1pbjsKCQkJfQoJCX0KCgkJZGVsZXRlIG5vZGU7CgkJcmV0dXJuIHRtcDsKCX0gZWxzZSBpZih2YWwgPCBub2RlLT52YWwpCgkJbm9kZS0+bGVmdCAgPSBEZWxldGVOb2RlKG5vZGUtPmxlZnQsIHZhbCk7CgllbHNlCgkJbm9kZS0+cmlnaHQgPSBEZWxldGVOb2RlKG5vZGUtPnJpZ2h0LCB2YWwpOwoJcmV0dXJuIG5vZGU7Cn0KCgppbnQgbWFpbih2b2lkKXsKCVRyZWUqIHRyZWUgPSBOVUxMOwoJZm9yKGludCBpID0gMDsgaSA8IDIwOyArK2kpCgkJdHJlZSA9IEluc2VydE5vZGUodHJlZSwgc3RkOjpyYW5kKCkgJSAxMCk7CgkKCVByaW50Tm9kZShzdGQ6OmNvdXQsIHRyZWUpOwoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCgl0cmVlID0gRGVsZXRlTm9kZSh0cmVlLCA1KTsKCXRyZWUgPSBEZWxldGVOb2RlKHRyZWUsIDIpOwoJdHJlZSA9IERlbGV0ZU5vZGUodHJlZSwgOSk7CgkKCVByaW50Tm9kZShzdGQ6OmNvdXQsIHRyZWUpOwoJQ2xlYXJOb2RlKHRyZWUpOwoJcmV0dXJuIDA7Cn0KCgovL9Cy0YHRgtCw0LLQutCwClRyZWUqIEluc2VydE5vZGUoVHJlZSogbm9kZSwgaW50IHZhbCl7CglpZihub2RlID09IE5VTEwpewoJCW5vZGUgPSBuZXcgKHN0ZDo6bm90aHJvdykgVHJlZSgpOwoJCWlmKG5vZGUgIT0gTlVMTCl7CgkJCW5vZGUtPnZhbCAgPSB2YWw7CgkJCW5vZGUtPmxlZnQgPSBub2RlLT5yaWdodCA9IE5VTEw7CgkJfQoJCXJldHVybiBub2RlOwoJfQoKCWlmKHZhbCA8IG5vZGUtPnZhbCkKCQlub2RlLT5sZWZ0ICA9IEluc2VydE5vZGUobm9kZS0+bGVmdCwgdmFsKTsKCWVsc2UKCQlub2RlLT5yaWdodCA9IEluc2VydE5vZGUobm9kZS0+cmlnaHQsIHZhbCk7CglyZXR1cm4gbm9kZTsKfQoKLy/Qv9C10YfQsNGC0YwKdm9pZCBQcmludE5vZGUoc3RkOjpvc3RyZWFtJiBfb3V0LCBjb25zdCBUcmVlKiBub2RlKXsKCWlmKG5vZGUgIT0gTlVMTCl7CgkJaWYobm9kZS0+bGVmdCAhPSBOVUxMKQoJCQlQcmludE5vZGUoX291dCwgbm9kZS0+bGVmdCk7CgoJCV9vdXQgPDwgbm9kZS0+dmFsIDw8ICcgJzsKCgkJaWYobm9kZS0+cmlnaHQgIT0gTlVMTCkKCQkJUHJpbnROb2RlKF9vdXQsIG5vZGUtPnJpZ2h0KTsKCX0KfQoKLy/Rg9C00LDQu9C10L3QuNC1INCy0YHQtdCz0L4Kdm9pZCBDbGVhck5vZGUoVHJlZSogbm9kZSl7CglpZihub2RlICE9IE5VTEwpewoJCWlmKG5vZGUtPmxlZnQgIT0gTlVMTCkKCQkJQ2xlYXJOb2RlKG5vZGUtPmxlZnQpOwoJCWlmKG5vZGUtPnJpZ2h0ICE9IE5VTEwpCgkJCUNsZWFyTm9kZShub2RlLT5yaWdodCk7CgkJZGVsZXRlIG5vZGU7Cgl9Cn0=