用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

二叉树的插入、删除、清空,更新等操作

2013-06-20 作者: 德良举报

[c++]代码库

#include<iostream>
#include<iomanip>
using namespace std;
typedef int 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){}
	};
	Node *rp;
	int n;
public:
	bst():rp(),n(){}
	void insert(Node* &t,Node *p)//插入节点
	{
		if(t==NULL) t=p;
		else if(p->data<t->data) insert(t->L,p);
		else insert(t->R,p);
	}
	void insert(const T&d){insert(rp,new Node(d));}

	Node *&find(Node *&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);			
	}
	Node *&find(const T&d){return find(rp,d);}
	
	void remove(const T&d)//删除节点
	{
		Node *&t=find(d);
		if(t==NULL) return;
		Node *p=t;
		if(t->L!=NULL) insert(t->R,t->L);
		t=t->R;
		delete p;
	}
	
	void clear(Node *&t)//清空二叉树
	{
		if(t!=NULL)
		{
			clear(t->L);
			clear(t->R);
			delete t;
			t=NULL;//注意这里t要置空,否则输出时会是随机数
		}
	}
	void clear(){clear(rp);}
	
	int high(Node *t)//求树的高度
	{
		if(t==NULL) return 0;
		int lh=high(t->L);
		int rh=high(t->R);
		return 1+(lh>rh?lh:rh); //每次通过这里不断的累加树的高度
	}	
	int high(){high(rp);}

	T &root()//查找根节点
	{
		if(rp==NULL) throw "空"; 
		return rp->data;
	}	
	
	void update(const T&olddata,const T&newdata)//更新一棵树
	{
		remove(olddata);
		insert(newdata); 
	}

	void travel(Node *t)//遍历整棵树
	{
		if(t!=NULL)
		{
			travel(t->L);
			cout<<t->data<<' ';
			travel(t->R);
		}
	}
	void travel(){travel(rp);cout<<endl;}

	void print(Node *t,int space,char sign)//打印一棵树
	{
		if(t==NULL) return;
		cout<<setw(space+1)<<sign<<t->data<<endl;
		print(t->R,space+2,'\\');
		//cout<<setw(space+1)<<sign<<t->data<<endl;
		print(t->L,space,'/');
		//print(t->R,space+3,'\\');
	}
	void print(){print(rp,6,'*');}
};
int main()
{
	bst b;
	b.insert(5);
	b.insert(3);
	b.insert(9);
	b.insert(4);
	b.insert(1);
	b.travel();
	cout<<"树的高度为:"<<b.high()<<endl;
	cout<<"根节点是:"<<b.root()<<endl;
	b.update(1,8);
	b.travel();
	b.print();
	b.remove(4);
	b.travel();
	b.clear();
	b.travel();
	return 0;
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...