二叉树查找
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉树查找
//树表的查找
#include
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
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 { insert(p,a[i]); i++; } return p; } //二叉树的查找函数 bstnode * search_bst(bstnode *p,int k) { if(p==NULL||p->key==k) return p; if(k 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 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< } //二分法插入排序 void binary_sort(int *a,int n) { int i,j,low,high,mid; int temp; for(i=1;i { temp=a[i]; low=0; high=i-1; while(low<=high) { mid=(low+high)/2; if(temp high=mid-1; else low=mid+1; } for(j=i-1;j>=high;j--) a[j+1]=a[j]; a[high+1]=temp;//插入} }