查找算法之二叉排序树

#include<iostream>
using namespace std;
#define infinity  32767
//定义二叉树的结构体
struct BSTreeNode
{
   int data;           //数据域
   BSTreeNode *lchild;       //左孩子指针
   BSTreeNode *rchild;        //右孩子指针
};

BSTreeNode *p;                //用于保存双亲节点                                         
//非递归算法查找二叉排序树
BSTreeNode *search(int key,BSTreeNode *T)
{
   p=NULL;                   //根节点的双亲节点为NULL
   BSTreeNode *q=T;          //保存根节点
   while(q && q->data!=key)
   {
	   p=q;//保存当前节点的双亲节点
	   if(key>q->data)
	   {//若查找的数据大于当前节点的数据,则往当前节点的右边移动
		   q=q->rchild;
	   }
	   else
	   //若查找的数据小于当前节点的数据,则往当前节点的左边移动
	   {
		  q=q->lchild;
	   }
   }//返回有两种情况:1.q==NULL,即没找到要查找的数据;2.q->data==key,即找到查找的数据
   return q;
}

//插入算法
void BSTreeNodeInsert(int key,BSTreeNode *&T)
{//插入数据前,先检验二叉树中是否已存在该数据,若不存在才可插入
   BSTreeNode *q=search(key,T);                      
   if(q==NULL)//插入数据不存在
   {
     q=new BSTreeNode;
	 q->data=key;
	 q->lchild=NULL;
	 q->rchild=NULL;
	 if(p==NULL)//当插入位置的双亲节点为NULL时,说明二叉树为NULL,插入位置为根节点位置
	 {
	   T=q;
	 }
	 else
	 {//当插入位置的双亲节点不为NULL时,说明插入位置为叶子节点
		 if(key>p->data)
		 {
			 p->rchild=q;
		 }
		 else
		 {
			 p->lchild=q;
		 }
	 }
   }
}
//创建二叉排序树
void createBSTree(BSTreeNode *&T)
{
  int n;
  cout<<"请输入二叉树节点数据\n";
  cin>>n;
  while(n!=infinity)
  {
     BSTreeNodeInsert(n,T);
     cout<<"请输入二叉树节点数据\n";
     cin>>n;
  }
}

//main函数
int main()
{
   BSTreeNode *T=NULL;
   createBSTree(T);
   int m;
   cout<<"请输入查找数据\n";
   cin>>m;
   BSTreeNode *q=search(m,T);
   if(q)
   {
	   cout<<"你要查找的数据:"<<q->data<<endl;
   }
   else
   {
       cout<<"error\n";
   }
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值