树表查找之二叉排序树

首先介绍下基本概念:二叉排序树是一棵二叉树,或者为空,或者满足以下条件:

①若左子树不空,则其上的值均小于根的值;

②若右子树不空,其上的值均不小于根的值;

③左右子树也是二叉排序树

下面以基本的构造二叉排序树和查找其中的元素来说明其基本的算法。

1、构造

构造的基本思想:假设已存在一棵二叉排序树,需要向其上添加元素。方法是新建一个指向node类型的

指针,将key装入该指针指向的区域,然后遍历二叉排序树以寻找到合适的位置,将新建节点链接上。至于如

何寻找合适位置,则是根据二叉排序树的特点,在左右子树不断寻找,直到找到一个合适的NULL位置。详见

代码。

2、查找

先比较根节点的关键字与待查元素的大小关系。如果相等,则表明查找到,查找结束;否则,如果前者大

于后者,则在左子树中查找;否则,在右子树中查找。

代码如下:

  1. #include<iostream>
  2. using namespace std;
  3. struct node //节点包含一个关键字和左右两个指向节点的指针
  4. {
  5. int key;
  6. node *lchild;
  7. node *rchild;
  8. };
  9. class bin_search_t //二叉排序树类
  10. {
  11. public:
  12. bin_search_t();
  13. void insert(node *&T,node *u);
  14. void create_bst(node *&T);
  15. node* visit(node *T,int value);
  16. node *root;
  17. };
  18. bin_search_t::bin_search_t()
  19. {
  20. root=NULL; //root为NULL决定了insert()和create_bst()都得用root的引用
  21. }
  22. void bin_search_t::insert(node *&T,node *u) //将u指示的节点元素插入到以T为根的排序树中
  23. {
  24. if(T==NULL) //每次都是在空处链接
  25. T=u;
  26. else if(u->key>T->key)
  27. insert(T->rchild,u);
  28. else
  29. insert(T->lchild,u);
  30. }
  31. void bin_search_t::create_bst(node *&T) //需要引用,因为下面有T=NULL语句,不引用就无法从root处访问了
  32. {
  33. node *u=NULL;
  34. const int MAX=9999; //标志构造结束
  35. int x;
  36. while(1)
  37. {
  38. cin>>x;
  39. if(x==MAX) break;
  40. u=new node;
  41. u->key=x;
  42. u->lchild=NULL;
  43. u->rchild=NULL;
  44. insert(T,u);
  45. }
  46. }
  47. /*递归查找*/
  48. node* bin_search_t::visit(node *T,int value)
  49. {
  50. if(T==NULL || T->key==value ) //把T==NULL放在前面会省去很多麻烦,因为当T==NULL时,T->key会出错
  51. return T;
  52. else if(T->key>value)
  53. return visit(T->lchild,value);
  54. else
  55. return visit(T->rchild,value);
  56. }
  57. /*
  58. 非递归查找
  59. node* bin_search_t_n::visit(node *T,int value)
  60. {
  61. node *p=T;
  62. while(p!=NULL)
  63. {
  64. if(p->key==value)
  65. return p;
  66. else if(p->key>value)
  67. p=p->lchild;
  68. else
  69. p=p->rchild;
  70. }
  71. return p;
  72. }
  73. */
  74. int main()
  75. {
  76. bin_search_t p;
  77. node *q;
  78. p.create_bst(p.root);
  79. q=p.visit(p.root,9); //以查找9为例
  80. cout<<q<<endl; //输出9的位置
  81. if(q!=NULL) //根据是否查找的,输出
  82. cout<<q->key<<endl;
  83. else
  84. cout<<"q==NULL"<<endl;
  85. return 0;
  86. }
#include<iostream>
using namespace std;

struct node   //节点包含一个关键字和左右两个指向节点的指针
{
	int key;
	node *lchild;
	node *rchild;
};

class bin_search_t  //二叉排序树类
{
public:
	bin_search_t();
	void insert(node *&T,node *u);
	void create_bst(node *&T);
	node* visit(node *T,int value);

	node *root;
};
bin_search_t::bin_search_t()
{
	root=NULL; //root为NULL决定了insert()和create_bst()都得用root的引用
}

void bin_search_t::insert(node *&T,node *u)  //将u指示的节点元素插入到以T为根的排序树中
{
	if(T==NULL)  //每次都是在空处链接
		T=u;
	else if(u->key>T->key)
		insert(T->rchild,u);
	else
		insert(T->lchild,u);
}

void bin_search_t::create_bst(node *&T)  //需要引用,因为下面有T=NULL语句,不引用就无法从root处访问了
{
	node *u=NULL;

	const int MAX=9999; //标志构造结束
	int x;

	while(1)  
	{
		cin>>x;
		if(x==MAX) break;

		u=new node;  
		u->key=x;
		u->lchild=NULL;
		u->rchild=NULL;

		insert(T,u);	
	}
}

/*递归查找*/
node* bin_search_t::visit(node *T,int value)
{
	if(T==NULL || T->key==value )  //把T==NULL放在前面会省去很多麻烦,因为当T==NULL时,T->key会出错
		return T;
	else if(T->key>value)
		return visit(T->lchild,value);
	else
		return visit(T->rchild,value);
}

/*
非递归查找
node* bin_search_t_n::visit(node *T,int value)
{
	node *p=T;

	while(p!=NULL)
	{
		if(p->key==value)
			return p;
		else if(p->key>value)
			p=p->lchild;
		else
			p=p->rchild;
	}

	return p;
}
*/

int main()
{
	bin_search_t p;
	node *q;

	p.create_bst(p.root);
	q=p.visit(p.root,9);   //以查找9为例

    cout<<q<<endl;     //输出9的位置
	if(q!=NULL)        //根据是否查找的,输出
	    cout<<q->key<<endl;
	else
		cout<<"q==NULL"<<endl;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值