二叉排序树

#include
using namespace std;
class Tree{
public:
	//constructor
	Tree():m_root(NULL), m_size(0){}
	//destructor
	~Tree(){
		clear();
	}
	// insert
	void insert(int data) {
		insert(new Node(data), m_root);
		m_size++;
	}
	//delete 含有data的一个节点
	bool remove(int data) {
//查找匹配节点
		Node*& find_node = find(data, m_root);
		if (find_node) {
//将匹配节点的左子树插入右子属
			insert(find_node->m_left, find_node->m_right);
			Node *node = find_node;
//用匹配节点的右子数去取代匹配节点
			find_node = find_node->m_right;
			delete node;
			m_size--;
			return true;
		}
		return false;
	}
	//删除data的所有节点
	void destroy(int data) {
		while(remove(data));
	}
	//清空树
	void clear(){
		clear(m_root);
	}
	//update
	void update(int _old, int _new) {
		while(remove(_old))
			insert(_new);
	}
	//exist
	bool exist(int data) {
		return find(data, m_root) != NULL;
	}
	// 遍历
	void search() {
		search(m_root);
	}
	//节点数
	unsigned int size() {
		return m_size;
	}
	//树高
	unsigned int height() {
		return height(m_root);
	}
private:
	class Node{
	public:
		Node(int data):m_data(data), m_left(NULL),m_right(NULL){}
		int m_data;
		Node *m_left;//left
		Node *m_right;//right
	};
	void insert (Node *node, Node *&tree) {
		if(!tree)
			tree = node;
		else if (node) {
			if(node->m_data < tree->m_data)
				insert(node, tree->m_left);
			else 
				insert(node, tree->m_right);
		}
	}
	Node*& find(int data, Node*& tree) {
		if(!tree)
			return tree;
		else if(data == tree->m_data)
			return tree;
		else if (data < tree->m_data)
			return find(data, tree->m_left);
		else
			return find(data, tree->m_right);
	}
	void clear (Node *&tree){
		if(tree){
			clear(tree->m_left);
			clear(tree->m_right);
			delete tree;
			tree = NULL;
		}
	}
	void search(Node *&tree) {//中序遍历,在这个函数中,调整顺序,可实现前序遍历和后序遍历
		if(tree) {
			search(tree->m_left);
			search(tree->m_right);
			cout<m_data<<" ";
		}
	}
	unsigned int height(Node *&tree) {
		if(tree){
			unsigned int lh = height(tree->m_left);
			unsigned int rh = height(tree->m_right);
			return (lh > rh?lh:rh) + 1;
		}
	}
	Node *m_root;//root
	unsigned int m_size;//size
};

int main() {
	Tree tree;
	tree.insert(5);
	tree.insert(3);
	tree.insert(7);
	tree.insert(4);
	tree.insert(2);
	tree.insert(8);
	tree.insert(6);
/*	tree.insert(7);
//	tree.insert(45);
//	tree.insert(4151);
//	tree.insert(4);
	tree.search();
	cout<<endl;
//	tree.destroy(7);
//	tree.search();
*/	cout<<tree.size()<<endl;
	cout<<tree.height()<<endl;
	cout<<endl;
	tree.remove(4);
//	tree.remove(7);
	tree.search();
	cout<<endl;
	cout<<tree.size()<<endl;
	cout<<tree.height()<<endl;
//	tree.exist(7);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值