手写BST插入查找删除

本文探讨了在实现二叉搜索树(BST)时,如何进行插入、查找和删除操作。重点指出理解指针为空并不意味着不能重新赋值,实际上可以将其指向新的内存空间,这一关键概念对于正确实现BST至关重要。
摘要由CSDN通过智能技术生成
binary search\sort\find tree operations


status InsertNode(Node* root, data x, Node* father)
{
	if(root==NULL)
	{
		if(father==NULL)
			Tree empty;
		else
		{
			if(x<father->data)
			{
				father->left=new Node//inital left right NULL
				father->left->data=x;
				return  success;
			}
			else if(father->data<x)
			{
				father->right=new Node;//inital left right NULL
				father->right->data=x;
				return succes;
			}
			else
			{
				return failure, have same data in BST//Hash also not allowed same data, but other such as array allow
			}
		}
	}
	if(x<root->data) InsertNode(root->left,x); //imitate big god fawks's code style : )
	else if(root->data<x) InsertNode(root->right,x);
	else
		return falure, have same data in BST;
}

后来发现,根本不需要father, 会出现上面的原因是我总以为指针为空,指针变量也不能在赋值了。有个错误理解,指针变量是一个变量,他的值为空,现在可以让他指向其他的地方,例如申请一个堆空间,他的值就是这个新的空间的地址值。


 
 
status InsertNode(Node* root, data x)
{
	if(root==NULL)
	{
		root=new Node;//assume initial left right NULL
		root->data=x;
	}
	if(x<root->data) InsertNode(root->left,x); //imitate big god fawks's code : )
	else if(root->data<x) InsertNode(root->right,x);
	else
		return falure, have same data in BST;
}





Node* FindNode(Node* root, data x, Node* father)//use father for delete recall
{
	if(root==NULL) return NULL;
	if(x<root->data) FindNode(root->left, x,root);
	else if(root0>data<x) FindNode(root->right,x,root);
	else
		return root;
}

status DeleteNode(Node* root, data x)
{
	Node* parent=NULL;
	Node* p=FindNode(root,x,parent);
	if(p==NULL)
		return failure, can not found x;
	if(parent==NULL)//BST only has a root
		return success root==NULL;//set BST as NULL
	if(p==parent->left)
	{
		if(p-left!=NULL)
		{
			move p's right child as p's leftchild's rightdownmost node's right child 
			parent->left=p->left;
		}
		else if(p->right!=NULL)
		{
			move p's left child as p's rightchild's leftdownmost node's left child;
			parent->left=p->right;
		}
		else// all null
		{
			parent->left==NULL;
		}
		delete p;
	}
	if(p==parent->right)
	{
		follow left part;
	}	
	return sucess;
}




总结指针bug就是 每次访问left right,都要考虑是否p为空,如果有空就另外处理,否则NULL访问left right 程序就crash了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值