C++实现二叉排序树

尽管C++的STL模板中有set、multiset等关联容器能够起到二叉排序树的作用,但是动手写一写二叉排序树能够提升写代码的能力,并且能够加深对二叉排序树思想的理解。

typedef int etype;

class BiTree {
public:
	BiTree* lchild, *rchild;
	etype data;

	void DeleteNode(BiTree* T,etype key, BiTree** f);
	bool SearchNode(BiTree* T, BiTree* f, etype key, BiTree** p);
	void InsertNode(BiTree** T, etype key);
	void Delete(BiTree* p, BiTree** f);
};


void BiTree::DeleteNode(BiTree* T, etype key, BiTree** f) {
	if (!T) {
		std::cout << "Delete Error!" << std::endl;
	}
	else if (T->data == key) {
		Delete(T,f);
	}
	else if (T -> data > key) {
		*f = T;
		DeleteNode(T->lchild, key,f);
	}
	else if (T->data < key) {
		*f = T;
		DeleteNode(T->rchild, key,f);
	}
	return;
}


bool BiTree::SearchNode(BiTree* T, BiTree* f, etype key, BiTree** p) {
	if (!T) {
		std::cout << "Not Find!" << std::endl;
		*p = f;
		return false;
	}
	else if (T->data == key) {
		std::cout << "Find it!" << std::endl;
		return true;
	}
	else if (T->data > key) {
		return SearchNode(T->lchild, T, key, p);
	}
	else if (T->data < key) {
		return SearchNode(T->rchild, T, key, p);
	}
}


void BiTree::InsertNode(BiTree** T, etype key) {
	BiTree* p = new BiTree;
	
	if (!SearchNode(*T, NULL, key, &p)) {
		BiTree* s = new BiTree;
		s->data = key;
		s->lchild = NULL;
		s->rchild = NULL;
		if (!p)
			*T = s;
		else if (p->data > key)
			p->lchild = s;
		else 
			p->rchild = s;
		std::cout << "Insert Successfully!" << std::endl;
	}
	return;
}


void BiTree::Delete(BiTree* p,BiTree** f) {
	if (!p->lchild&&!p->rchild) {
		if ((*f)->lchild == p)(*f)->lchild = NULL;
		else (*f)->rchild = NULL;
		delete p;
	}
	else if (!p->lchild) {
		BiTree* q = p;
		p = p->rchild;
		if ((*f)->lchild == q)(*f)->lchild = p;
		else (*f)->rchild = p;
		delete q;
	}
	else if (!p->rchild) {
		BiTree* q = p;
		p = p->lchild;
		if ((*f)->lchild == q)(*f)->lchild = p;
		else (*f)->rchild = p;
		delete q;
	}
	else {
		BiTree* q = p,* s=p->lchild;
		while (s->rchild) {
			q = s;
			s = s->rchild;
		}
		p->data = s->data;
		if(q!=p)
			q->rchild = s->lchild;
		else 
			q->lchild = s->lchild;
		delete s;
	}
	return;
}


int main() {
	int demo[5] = { 1,2,8,4,6 };
	BiTree* T = new BiTree;
	T = NULL;
	for (int i = 0; i < 5; i++)
		T->InsertNode(&T, demo[i]);
	BiTree* p = new BiTree;
	BiTree* f = new BiTree;
	T->SearchNode(T,NULL,4,&p);
	T->DeleteNode(T, 4, &f);
	T->SearchNode(T, NULL, 4, &p);
	delete p;
	delete T;
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值