二叉排序樹的實現

weixin_34219944發表於2013-08-04
/*
 * 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();
}


相關文章