Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool BSTree::remove(int num){
- if(root == NULL){
- return false;
- }
- if(root->value == num){
- if(root->left == NULL && root->right == NULL){
- delete root;
- this->root = NULL;
- return true;
- }
- return leafDoubleBranch(root);
- //return true;
- }
- return removeLoop(root, num);
- }
- bool BSTree::removeLoop(Node * n, int val){
- if(n->value == val){
- return leafDoubleBranch(n);
- }
- if(n->value > val){
- if(n->left == NULL){
- return false;
- } else {
- return removeLoop(n->left, val);
- }
- }
- if(n->value < val){
- if(n->right == NULL){
- return false;
- } else {
- return removeLoop(n->right, val);
- }
- }
- return false;
- }
- bool BSTree::leafDoubleBranch(Node * n){
- Node * temp;
- temp = n;
- if(temp->left){
- temp = temp->left;
- while(temp->right){
- temp = temp->right;
- }
- if(temp == temp->parent->left){
- temp->parent->left = NULL;
- } else {
- temp->parent->right = NULL;
- }
- if(temp->left){
- temp->left->parent = temp->parent;
- temp->left->parent->left = temp->left;
- }
- n->value = temp->value;
- delete temp;
- return true;
- } else if (temp->right){
- temp = temp->right;
- while(temp->left){
- temp = temp->left;
- }
- if(temp == temp->parent->left){
- temp->parent->left = NULL;
- } else {
- temp->parent->right = NULL;
- }
- if(temp->right){
- temp->right->parent = temp->parent;
- temp->right->parent->right = temp->right;
- }
- n->value = temp->value;
- delete temp;
- return true;
- } else {
- //its a leaf
- if(n->left == NULL && n->right == NULL){
- //no children
- if(n->value < n->parent->value){
- //left leaf
- n->parent->left = NULL;
- } else {
- //right leaf
- n->parent->right = NULL;
- }
- delete n;
- return true;
- }
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement