当前位置:文档之家› 二叉树查找

二叉树查找

二叉树查找
//树表的查找
#include<iostream>
using namespace std;
typedef struct node{
int key;
struct node *lchild;
struct node *rchild;
}bstnode;//二叉树节点
//二叉树的生成
int insert(bstnode *&p,int k)
{
if(p==NULL)//原来的数时空树
{
p=new bstnode;
p->key=k;
p->lchild=NULL;
p->rchild=NULL;
return 1;
}
else if(k==p->key)
return 0;//树中存在相同的节点,返回0
else if(k<p->key)
return insert(p->lchild,k);
else
return insert(p->rchild,k);
}
//二叉树的创建
bstnode *creat(int *a,int n)
{
bstnode *p=NULL;//初始化空数
int i=0;
while(i<n)
{
insert(p,a[i]);
i++;
}
return p;
}
//二叉树的查找函数
bstnode * search_bst(bstnode *p,int k)
{
if(p==NULL||p->key==k)
return p;
if(k<p->key)
return search_bst(p->lchild,k);
else
return search_bst(p->rchild,k);
}
bool search(bstnode *p,int k)
{
bstnode *bt;
bt=search_bst(p,k);
if(bt==NULL)
return 0;
else
return 1;
}
//二叉树的删除操作
void delete1(bstnode*p,bstnode*&r)//当被删除的节点p有左右节点的时候的删除{
bstnode *q;
if(r->rchild!=NULL)
delete1(p,r->rchild);//递归找到最右下节点
else
{
p->key=r->key;//将r的关键字幅值
q=r;
r=r->lchild;//直接将其左子树的根节点放到被删除节点的位置上
delete q;
}
}
void delete_node(bstnode *&p)//删除节点
{
bstnode *q;
if(p->rchild==NULL)//没有右子树
{
q=p;
p=p->lchild;
delete q;
}
else if(p->lchild==NULL)
{
q=p;
p=p->rchild;
delete q;
}
else
delete1(p,p->lchild);
}
bool delete_bst(bstnode *&p,int k) {
if(p==NULL)
return 0;
else
{
if(k<p->key)
return delete_bst(p->lchild,k);
else if(k>p->key)
return delete_bst(p->rchild,k);
else//找到了要删除的节点
{
delete_node(p);
return 1;
}
}
}
int main()
{
int a[7]={11,7,16,3,9,26,18};
bstnode *p;
p=creat(a,7);
cout<<search(p,0)<<endl;
}
//二分法插入排序
void binary_sort(int *a,int n)
{
int i,j,low,high,mid;
int temp;
for(i=1;i<n;i++)
{
temp=a[i];
low=0;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(temp<a[mid])
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=high;j--)
a[j+1]=a[j];
a[high+1]=temp;//插入}
}。

相关主题