/*实作一BSF,具有Insert, Delete两个主要函数*/
/*主要思路来源于台湾清华大学韩永楷老师的数据结构MOOC(其实就是听他讲后自己写的)*/
/*C语言代码实现*/
#include <stdio.h>
#include <stdlib.h>
struct node{
int key;
struct node *left, *right, *parent;
};
typedef struct node Node;
Node *root = NULL;
/*insert z in a tree whose root is x*/
void Insert(Node *x, Node *z)
{
if (root == NULL){root = z; root->parent = NULL; return;} //特别注意,第一个是用root不是用x!!!
if(z->key < x->key){
if(!x->left) {x->left = z; z->parent = x;}
else Insert(x->left, z);
}
else if(z->key > x->key){
if(!x->right) {x->right = z; z->parent = x;}
else Insert(x->right, z);
}
else printf("The input node have existed in the tree!\n");
}
Node *Search(Node *r, int k)
{
if(!r) return NULL;
if(r->key == k) return r;
else if (k < r->key) return Search(r->left, k);
else return Search(r->right, k);
}
void PreOrderTraversal(Node *r)
{
if(r == NULL) return;
printf("%d ",r->key);
if(r->left) PreOrderTraversal(r->left);
if(r->right) PreOrderTraversal(r->right);
}
void InOrderTraversal(Node *r)
{
if(r == NULL) return;
if(r->left) InOrderTraversal(r->left);
printf("%d ",r->key);
if(r->right) InOrderTraversal(r->right);
}
void Delete(Node *x)
{
Node *y = x->right;
if(x == root)
{
/*Case 1: x is only the node in the tree as a root*/
if(!x->left && !x->right)
{
root = NULL;
}
/*Case 2: x has one child*/
else if (!x->left){//x has not left child
root = x->right;
x->right->parent = NULL;
}
else if (!x->right){//x has not right child
root = x->left;
x->left->parent = NULL;
}
/*Case 3: x has two children*/
else{
while(y->left)
y = y->left;
/*special case*/
if(x->right == y)
{
y->left = x->left;
x->left->parent = y;
y->parent = NULL;
root = y;
}
/*general case*/
else
{
Node *y_parent = y->parent,*y_child = y->right;
root = y;
y->parent = NULL;
y->left = x->left;
x->left->parent = y;
y->right = x->right;
x->right->parent = y;
y_parent->left = y_child;
if(y_child) y_child->parent = y_parent;
}
}
}
else
{
/*Case 1: x is leaf*/
if(!x->left && !x->right)
{
if(x->parent->left == x)
x->parent->left = NULL;
else
x->parent->right = NULL;
}
/*Case 2: x has one child*/
else if (!x->left){//x has not left child
if(x->parent->left == x)
{
x->parent->left = x->right;
x->right->parent = x->parent;
}
else
{
x->parent->right = x->right;
x->right->parent = x->parent;
}
}
else if (!x->right){//x has not right child
if(x->parent->left == x)
{
x->parent->left = x->left;
x->left->parent = x->parent;
}
else
{
x->parent->right = x->left;
x->left->parent = x->parent;
}
}
/*Case 3: x has two children*/
else{
while(y->left)
y = y->left;
/*special case*/
if(x->right == y)
{
if(x->parent->left == x)
{
x->parent->left = y;
y->parent = x->parent;
y->left = x->left;
x->left->parent = y;
}
else
{
x->parent->right = y;
y->parent = x->parent;
y->left = x->left;
x->left->parent = y;
}
}
/*general case*/
else
{
Node *y_parent = y->parent,*y_child = y->right;
if(x->parent->left == x)
{
x->parent->left = y;
y->parent = x->parent;
y->left = x->left;
x->left->parent = y;
y->right = x->right;
x->right->parent = y;
}
else
{
x->parent->right = y;
y->parent = x->parent;
y->left = x->left;
x->left->parent = y;
y->right = x->right;
x->right->parent = y;
}
y_parent->left = y_child;
if(y_child) y_child->parent = y_parent;
}
}
}
}
int main(int argc, char *argv[]) {
Node *new_node;
new_node = (Node*)malloc(sizeof(Node));
new_node->left = new_node->right = NULL;
new_node->key = 5;
Insert(root, new_node);
new_node = (Node*)malloc(sizeof(Node));
new_node->left = new_node->right = NULL;
new_node->key = 10;
Insert(root, new_node);
new_node = (Node*)malloc(sizeof(Node));
new_node->left = new_node->right = NULL;
new_node->key = 7;
Insert(root, new_node);
new_node = (Node*)malloc(sizeof(Node));
new_node->left = new_node->right = NULL;
new_node->key = 13;
Insert(root, new_node);
new_node = (Node*)malloc(sizeof(Node));
new_node->left = new_node->right = NULL;
new_node->key = 12;
Insert(root, new_node);
new_node = (Node*)malloc(sizeof(Node));
new_node->left = new_node->right = NULL;
new_node->key = 2;
Insert(root, new_node);
printf("PreOrderTraverSal :"); PreOrderTraversal(root); printf("\n");
printf("InOrderTraverSal :"); InOrderTraversal(root); printf("\n");
/*判断Search的正确性 */
/*
if(Search(root,13)) printf("13 exist in tree\n");
else printf("13 is not exist in tree\n");
if(Search(root,12)) printf("12 exist in tree\n");
else printf("12 is not exist in tree\n");
if(Search(root,100)) printf("100 exist in tree\n");
else printf("100 is not exist in tree\n");
*/
if(Search(root,13))
{Delete(Search(root,13)); printf("13 has been deleted!\n");free(Search(root,13));}
else printf("13 Not found!\n");
if(Search(root,12)) {
Delete(Search(root,12)); printf("12 has been deleted!\n");free(Search(root,12));}
else printf("12 Not found!\n");
if(Search(root,100)) {
Delete(Search(root,100)); printf("100 has been deleted!\n");free(Search(root,100));}
else printf("100 Not found!\n");
if(Search(root,5)) {
Delete(Search(root,5)); printf("5 has been deleted!\n");free(Search(root,5));}
else printf("5 Not found!\n");
printf("PreOrderTraverSal :"); PreOrderTraversal(root); printf("\n");
printf("InOrderTraverSal :"); InOrderTraversal(root); printf("\n");
return 0;
}