二叉树

排序二叉树是经常遇到的一个数据结构,相关的递归算法也是考察的重点。以下c++示例代码作为相关总结和备份:

#include <iostream>
using namespace std;

typedef int T;

//下面是关于二叉树的遍历、查找、删除、更新数据的代码(递归算法):
class bst
{
	struct Node{
		T data;
		Node* L;
		Node* R;
		Node(const T& d,Node* lp=NULL,Node* rp=NULL):data(d),L(lp),R(rp){}
	};

	Node* root;
	int num;

	public:
		bst():root(NULL),num(0)
		{}

		void clear(Node* t){
			if(t==NULL) 
				return;
			clear(t->L);
			clear(t->R);
			delete t;
			t = NULL;
		}

		~bst()
		{
			clear(root);
		}

		void clear(){
			clear(root);
			num = 0;
			root = NULL;
		}

		bool empty(){
			return root==NULL;
		}

		int size(){
			return num;
		}

		T getRoot(){
			if(empty()) throw "empty tree";
			return root->data;
		}

		//LNR-Travel  N(Node)、L(Left subtree)和R(Right subtree)
		void travel(Node* tree){
			if(tree==NULL) return;
			travel(tree->L);
			cout << tree->data << ' ';
			travel(tree->R);
		}

		void travel(){
			travel(root);
			cout << endl;
		}

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

		int height(){
			return height(root);
		}

		void insert(Node*& tree,const T& d){
		if(tree==NULL)
			tree = new Node(d);
		else if(d < tree->data)
			insert(tree->L,d);
		else
			insert(tree->R,d);
		}

		void insert(const T& d){
			insert(root,d);
			num++;
		}

		//Pass in the reference and return a reference for later write operation(such as modifiing data value)
		Node*& find(Node*& tree,const T& d){
			if(tree==NULL) return tree;
			if(tree->data == d) return tree;
			if(d < tree->data)
				return find(tree->L,d);
			else
				return find(tree->R,d);
		}

		bool find(const T& d){
			return find(root,d)!=NULL;
		}

		bool update(const T& od,const T& nd){
			Node* p = find(root,od);
			if(p==NULL) 
				return false;
			erase(od);
			insert(nd);
			return true;
		}

		bool erase(const T& d){
			Node*& pt = find(root,d);
			if(pt==NULL) 
				return false;

			combine(pt->L,pt->R);
			Node* p = pt;
			pt = pt->R;
			delete p;
			//don't forget to value the ptr as NULL
			p=NULL;

			num--;
			return true;
		}

//               A(9)
//              /  \
//             B(7) C(15)
//            /    /  \
//           D(5) E(13)F(21) 
		//spend some time to understand this func
		/*this function only works for combination after deleting one note. Not the case that any one item is added into the binary tree.*/
	private:
		void combine(Node* lc,Node*& rc){
			if(lc==NULL) 
				return;
			if(rc==NULL)          //if the right sibling is empty, then, the note item replace its parent.  
				rc = lc;
			else 
				combine(lc,rc->L);//always "Gua" the note item(lc) to the left(est) leaf of his right sibling(rc)
		}		
};

int _tmain(int argc, _TCHAR* argv[])
{
	//input and construct the BST
	bst b;
	cout << "input some integers:";
	for(;;){
		int n;
		cin >> n;
		b.insert(n);
		if(cin.peek()=='\n') 
			break;
	}

	//find the old value node, then delete it and replace with the node with new value 
	for(;;){
		cout << "input data pair:";
		int od,nd;
		cin >> od >> nd;
		if(od == -1 && nd == -1)
			break;
		b.update(od,nd);
	}

	b.travel();

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值