#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;
}
查找算法之二叉排序树
最新推荐文章于 2024-02-21 18:52:55 发布