实作Binary Search Tree

/*实作一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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值