Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if(node->left == NULL && node->right == NULL)//leaf node
- {
- if(node == *p_root)
- *p_root = NULL;
- else
- {
- if(node->parent->left == node)
- node->parent->left = NULL;
- else
- node->parent->right = NULL;
- }
- }
- else if(node->right == NULL)// singular left child
- {
- if(node == *p_root)
- *p_root = node->left;
- else
- {
- if(node->parent->right == node)
- node->parent->right = node->left;
- else
- node->parent->left = node->left;
- node->left->parent = node->parent;
- }
- }
- else if(node->left == NULL)//singular right child
- {
- if(node == *p_root)
- *p_root = node->right;
- else
- {
- if(node->parent->right == node)
- node->parent->right = node->right;
- else
- node->parent->left = node->right;
- node->right->parent = node->parent;
- }
- }
- else if(node->left != NULL && node->right != NULL)//two children
- {
- struct tree_node *maxleft_par = NULL;
- struct tree_node *maxleft = node->left;//initial Max left
- while(maxleft->right) //max left
- {
- maxleft_par = maxleft;
- maxleft = maxleft->right;
- }
- //check to see if maxleft is the root of another tree that's smaller (aka if it has a left child)
- if(maxleft->left != NULL) //sub tree
- {
- struct tree_node *temp = maxleft;
- maxleft_par->right = maxleft->left;//changes pointers parents/child
- free(maxleft);
- maxleft_par->right->parent = maxleft_par;
- node->left->parent = temp;
- temp->left = node->left;
- node->right->parent = temp;
- temp->right = node->right;
- if(node == *p_root)
- *p_root = temp;
- else
- {
- if(node->parent->left == node)
- node->parent->left = temp;
- else
- node->parent->right = temp;
- temp->parent = node->parent;
- }
- }
- else//non -existant sub tree
- {
- if(maxleft_par == NULL)
- {
- maxleft->right = node->right;
- node->right->parent = maxleft;
- *p_root = maxleft;
- }
- }
- }
- node->left = NULL;
- node->right = NULL;
- node->parent = NULL;
- return node;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement