问题描述 利用建立二叉排序树树对顺序表进行排序。

二叉排序树
二叉排序树(二叉排序树)二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;目录 步骤:若根结点的关键字值等于查找的关键字,成功。 否则,若小于根结点的关键字值,递归查左子树。 若大于根结点的关键字值,递归查右子树。 若子树为空,查找不成功。 平均情况分析(在成功查找两种的情况下): 在一般情况下,设 P(n,i)为它的左子树的结点个数为 i 时的平均查找长度。如图的结点个数为 n = 6 且 i = 3; 则 P(n,i)= P(6, 3) = [ 1+ ( P(3) + 1) * 3 + ( P(2) + 1) * 2 ] / 6= [ 1+ ( 5/3 + 1) * 3 + ( 3/2 + 1) * 2 ] / 6 注意:这里 P(3)、P(2) 是具有 3 个结点、2 个结点的二叉分类树的平均查找长度。 在一般情况,P(i)为具有 i 个结点二叉分类树的平均查找长度。 P(3) = (1+2+2)/ 3 = 5/3 P(2) = (1+2)/ 2 = 3/2∴ P(n,i)= [ 1+ ( P(i) + 1) * i + ( P(n-i-1) + 1) * (n-i-1) ] / n ∴ P(n)=P(n,i)/ n &= 2(1+I/n)lnn 因为 2(1+I/n)lnn≈1.38logn 故P(n)=O(logn)与次优二叉树相对,二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。首先执行查找算法,找出被插结点的父亲结点。 判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。 若二叉树为空。则首先单独生成根结点。 注意:新插入的结点总是叶子结点。 //在二叉排序树中插入查找关键字keyvoidInsertBST(t,key){if(t==NULL){t=newBiTt-&lchild=t-&rchild=NULL;t-&data=}if(key&t-&data)InsertBST(t-&lchild,key);elseInsertBST(t-&rchild,key);}//n个数据在数组d中,tree为二叉排序树根voidCreateBiTree(tree,d[],n){tree=NULL;for(i=0;i&n;i++)InsertBST(tree,d[i]);}最小值二叉树c例程: #include&stdio.h&structpriorityqueue{structpriorityqueue*}*structpriorityqueue*initialize(intmaxelements){structpriorityqueue*h;h=malloc(sizeof(structpriorityqueue));h-&elements=malloc(sizeof(int)*(maxelements+1));h-&capacity=h-&size=0;h-&elements[0]=-23767;}voidinsert(intx,structpriorityqueue*h){for(i=++h-&h-&elements[i/2]&x;i/=2)h-&elements[i]=h-&elements[i/2];h-&elements[i]=x;}intdeletemin(structpriorityqueue*h){inti,intminelement,minelement=h-&elements[1];lastelement=h-&elements[h-&size--];for(i=1;i*2&=h-&i=child){child=i*2;if(child!=h-&size&&h-&elements[child+1]&h-&elements[child])child++;if(lastelement&h-&elements[child])h-&elements[i]=h-&elements[child];}h-&elements[i]=}main(){tryit=initialize(10);insert(4,tryit);insert(5,tryit);insert(10,tryit);insert(3,tryit);printf(&%d\n&,deletemin(tryit));printf(&%d\n&,deletemin(tryit));printf(&%d\n&,deletemin(tryit));printf(&%d\n&,deletemin(tryit));getch();}在二叉排序树删去一个结点,分三种情况讨论: 若*p结点为叶子结点,即PL(左子树)和PR(右子树)均为空树。由于删去叶子结点不破坏整棵树的结构,则只需修改其双亲结点的指针即可。 若*p结点只有左子树PL或右子树PR,此时只要令PL或PR直接成为其双亲结点*f的左子树(当*p是左子树)或右子树(当*p是右子树)即可,作此修改也不破坏二叉排序树的特性。 若*p结点的左子树和右子树均不空。在删去*p之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,可以有两种做法: 其一是令*p的左子树为*f的左/右(依*p是*f的左子树还是右子树而定)子树,*s为*p左子树的最右下的结点,而*p的右子树为*s的右子树; 其二是令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)-即让*f的左子树(如果有的话)成为*p左子树的最左下结点(如果有的话),再让*f成为*p的左右结点的父结点。 在二叉排序树上删除一个结点的算法如下: C代码 #defineStatusboolStatusDelete(BiTree*);//必须先申明StatusDeleteBST(BiTree&T,KeyTypekey){//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素,并返回//TRUE;否则返回FALSEif(!T)//不存在关键字等于key的数据元素else{if(key==T-&data.key){//找到关键字等于key的数据元素returnDelete(T);}elseif(key&T-&data.key)returnDeleteBST(T-&lchild,key);elsereturnDeleteBST(T-&rchild,key);}}StatusDelete(BiTree&p){//从二叉排序树中删除结点p,并重接它的左或右子树if(!p-&rchild){//右子树空则只需重接它的左子树q=p;p=p-&}elseif(!p-&lchild){//左子树空只需重接它的右子树q=p;p=p-&}else{//左右子树均不空q=p;s=p-&while(s-&rchild){q=s;s=s-&}//转左,然后向右到尽头p-&data=s-&//s指向被删结点的“前驱”if(q!=p)q-&rchild=s-&//重接*q的右子树elseq-&lchild=s-&//重接*q的左子树}}Java代码 /***方法名称:delete()*方法描述:删除节点*@param采用递归的方式进行删除*@returnString*@Exception*/publicvoiddelete(BinarySortTreeroot,intdata){if(root!=null){if(root.data&data){//查找右孩子delete(root.rChild,data);}elseif(root.data&data){delete(root.lChild,data);}else{deleteNode(root);}}}/***方法名称:deleteNode()*方法描述:执行具体的删除操作*@param*@returnString*@Exception*/privatevoiddeleteNode(BinarySortTreep){//TODOAuto-generatedmethodstubif(p!=null){//如果节点有左子树/*1。若p有左子树,找到其左子树的最右边的叶子结点r,用该叶子结点r来替代p,把r的左孩子作为r的父亲的右孩子。2。若p没有左子树,直接用p的右孩子取代它。*/if(p.lChild!=null){BinarySortTreer=p.lCBinarySortTreeprev=p.lCwhile(r.rChild!=null){prev=r;r=r.rC}p.data=r.//若r不是p的左子树,p的左子树不变,r的左子树作为r的父节点的右孩子节点if(prev!=r){prev.rChild=r.lC}else{//若r是p的左子树,则p的左子树只想r的左子树p.lChild=r.lC}}else{p=p.rC}}}
内容来源自:
词条内容仅供参考,如果您需要解决具体问题(尤其在法律、医学等领域),建议您咨询相关领域专业人士。
二叉查找树,排序二叉树
浏览次数 : 4063 次
编辑次数 : 1 次
更新时间 :
词条创建者 :
双语连环画数据结构课程设计任务书-3_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
2页免费1页免费1页免费40页7下载券3页1下载券 8页免费2页免费3页免费4页免费7页免费
数据结构课程设计任务书-3|利​用​二​叉​排​序​树​对​顺​序​表​进​行​排​序
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢二叉排序树的实现:分别以顺序表和二叉链表作为存储结构,实现二叉排序树。基本操作有查找、插入、删除。_百度知道
二叉排序树的实现:分别以顺序表和二叉链表作为存储结构,实现二叉排序树。基本操作有查找、插入、删除。
不知对不对,急用!拜托了芙肇扳刮殖钙贷咆,希望高手帮忙改一改,再帮我转换一个用顺序表作为存储结构的我写了个用二叉链表作为存储结构的
elsefather-&gt,p;p = search_tree(*T;else if (elem &while (p && p-&if (father == NULL)*T =c-&gt.h&gt.h&data =lchild = c-&data)p = p-&BiTree search_tree(BiTree T;struct BiTnode *if (;}BiTif (; p-&rchild = NULL!p)return -1;data)father-&}int Insert_tree(BiTree *T,*BiT#include &lt,BiTree *father){BiT father-&int main(){}typedef struct BiTnode{c-&gt!c)return -1;rchild =data!=keyword){*father = p,&father),int elem){BiTree c,struct BiTnode *c = (BiTnode *)malloc(sizeof(BiTnode));*father = NULL;lchild = c,p = T;if (keyword &lt#include &elsep = p-&stdio,return 0;}return p
提问者采纳
printf(&2'
inorder(t, -1;C++ code#in肛倡催可诎玖给擞clude &stdio, -1;;1&#39.h&gt, 结点的地址是顺序表的索引值时间复杂度是 nC/
}}void main(){
Node t[3] ={{&#39, t[root].right), 2} , {&#39, t[root];}N, {&#39, -1},;void inorder(Node t[], int root){
if(typedef struct Nod{
char d, 1;.left);r&#39.d);%c &quot, t[root], -1}}楼主注意用顺序表作二叉树的存储结构的结点的结构;
inorder(t, 0)!=-1)
提问者评价
按默认排序
其他1条回答
inTree root, int i
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁文档贡献者
该文档贡献者很忙,什么也没留下。
下载此文档
正在努力加载中...
数据结构二叉排序树
文档星级:
内容提示:数据结构二叉排序树 数据结构二叉排序树 数据结构二叉排序树 数..
文档格式:PDF|
浏览次数:17|
上传日期: 23:51:00|
下载积分:
该用户还上传了这些文档
官方公共微信
下载文档:数据结构二叉排序树.PDF中级--软件设计师历年真题题库
本试题来自:(2005年中级--软件设计师历年真题,)在常用的描述二叉排序树的存储结构中,关键字值最大的结点 ( ) 。A.左指针一定为空B.右指针一定为空C.左右指针均为空D.左右指针均不为空正确答案:有, 或者
您可能感兴趣的试题
单项选择题:()在以下组织中,______制定的标准是国际标准。A.ISO和ANSIB.IEEE和IECC.ISO和IECD.IEEE和CEN答案:有,答案解析:有,单项选择题:()某32位计算机的cache容量为16KB,cache块的大小为16B,若主存与cache的地址映射采用直接映射方式,则主存地址为(十六进制)的单元装入的cache地址为______。A.00 01(二进制)B.01 00(二进制)C.10 00(二进制)D.11 00(二进制)答案:有,答案解析:有,
中级--软件设计师历年真题最新试卷
中级--软件设计师历年真题热门试卷}

我要回帖

更多关于 建立二叉排序树 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信