二叉排序树的实现

/*
 * bst.cpp
 *
 *  Created on: 2013年8月3日
 *      Author: 黄俊东
 *      加油,努力就会有机会。总有一天我会有章泽天那样的女朋友的。。。。。。
 */

#include <iostream>

using namespace std;

typedef char T;
class bst{
	struct Node{
		T data;
		Node* L;
		Node* R;
		Node(const T& d):data(d),L(),R(){
		}
		Node(const T& d,Node* l , Node* r):data(d),L(l),R(r){
		}
	};

	typedef Node* tree;
	Node* rp;//指向根节点
	int n;//节点个数

public:
	bst():rp(),n(){

	}

	void insert(tree& t,Node* p){
		if(t == NULL){
			t = p;
		}else if(p->data < t->data){
			insert(t->L,p);
		}else{
			insert(t->R,p);
		}
	}

	tree& find(tree& t , const T& d){
		if(t == NULL){
			return t;
		}else if(d == t->data){
			return t;
		}else if(d<t->data){
			return find(t->L,d);
		}else{
			return find(t->R,d);
		}
	}

	void travel(tree t)const{
		if(t != NULL){
			travel(t->L);
			cout<<t->data<<' ';
			travel(t->R);
		}
	}

	void clear(tree t){
		if(t!= NULL){
			clear(t->L);
			clear(t->R);
			delete t;
			t=NULL;
		}
	}

	int high(tree t){
		if(t == NULL){
			return 0;
		}
		int lh = high(t->L);
		int rh = high(t->R);
		return 1+((lh>rh)?lh:rh);

	}
	void clear(){
		clear(rp);
	}

	~bst(){
		clear();
	}

	void insert(const T& d){
		insert(rp,new Node(d));
		++n;
	}

	tree& find(const T& d){
		return find(rp,d);
	}

	void travel()const{
		travel(rp);
		cout<<endl;
	}

	bool empty()const{
		return rp == NULL;
	}

	int size()const{
		return n;
	}

	bool remove(const T& d){
		tree& t = find(d);
		if(t == NULL){
			return false;
		}
		Node* p = t;
		if(t->L!=NULL){
			insert(t->R,t->L);
		}
		t= t->R;
		delete p;
		--n;
		return true;
	}

	const T& root()const{
		if(!rp){
			throw "空";
		}

		return rp->data;
	}

	void update(const T& olddata , const T& newdata){
		if(remove(olddata)){
			insert(newdata);
		}
	}
};

int main(){
	bst b;
	b.insert('k');b.insert('s');b.insert('f');b.insert('t');
	b.insert('a');b.insert('m');b.insert('x');b.insert('e');
	b.insert('w');b.insert('b');b.insert('u');b.insert('j');
	b.travel();

	b.remove('k');b.remove('m');b.remove('j');b.remove('u');
	b.travel();

	while(!b.empty()){
		b.remove(b.root());
	}
	cout<<"size:"<<b.size()<<endl;
	b.travel();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值