动态查找之二叉排序树,C++代码实现

#include <iostream> using namespace std; typedef struct BSTNode { int key; struct BSTNode *lchild,*rchild; }BSTNode,*BSTree; //二叉排序树的插入——递归实现 void InsertBST(BSTree &DT,BSTNode *p) { if(DT==NULL) DT=p; else if((DT->key) > (p->key)) InsertBST(DT->lchild,p); else InsertBST(DT->rchild,p); } //二叉排序树结点的删除 void DeleteBST(BSTree &DT,BSTNode *p) {//要删除结点p,f是p的双亲 BSTNode *f; BSTNode *q,*fq; if(!(p->lchild)&&!(p->rchild))//第一种情况:p是叶子结点 { if(f->lchild==p)//p是左孩子 f->lchild=NULL; else//p是右孩子 f->rchild=NULL; q=p; } else if(!(p->rchild))//第二种情况:(1)p只有左子树 { if(f->lchild==p) f->lchild=p->lchild; else f->rchild=p->lchild; q=p; } else if(!(p->lchild))//第二种情况:(2)p只有右子树 { if(f->lchild==p) f->lchild=p->rchild; else f->rchild=p->rchild; q=p; } else //第三种情况:p既有左子树又有右子树 {//用p的中序后继来代替p fq=p;//fq是q的双亲 q=p->lchild; while(q->lchild) {//遍历找到p的中序后继 fq=q; q=q->lchild; } p->key=q->key; if(fq==p) fq->rchild=q->rchild; else fq->lchild=q->rchild; } delete q; } //二叉排序树的构造 void CreateBST(BSTree &DT,int n) { int i,j; int r[100]; BSTNode *s; DT=NULL;//这里一定要将DT置空,表示刚开始的时候是空树,不置空的话,编译器分配的DT是非空的 for(j=0;j<n;j++) cin>>r[j]; for(i=0;i<n;i++) { s=new BSTNode; s->key=r[i]; s->lchild=NULL; s->rchild=NULL; InsertBST(DT,s); } } //二叉排序树的搜索——递归实现 BSTNode * SearchBST(BSTree &DT,int k) { BSTNode *p; p=DT; if(DT==NULL) return NULL; else if(p->key==k) return p; else if(p->key>k) return SearchBST(p->lchild,k); else return SearchBST(p->rchild,k); } void main() { freopen(“in.txt”,”r”,stdin); BSTree DT; BSTNode *p; int k; CreateBST(DT,13); cin>>k; p=SearchBST(DT,k); cout<<p->key<<endl; //DeleteBST(DT,p); } 

这个二叉排序树不难,可是我有一个地方不太明白,就是二叉排序树结点的删除,首先删除某个结点,一定要知道结点的位置吧,也就是要查找表才能确定你所删除元素的位置,其次结点的删除需要用到被删除结点的双亲,要说那个结点吧,查找一下就能找到那个结点的位置,可是要找它的双亲,就比较困难了啊,难道还得修改查找的算法,让它也能找到某个结点的双亲?总之这个程序还不是很完美,我还得继续改进这个程序!

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/hackerain/article/details/6093167
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞