排序二叉树.ppt
《排序二叉树.ppt》由会员分享,可在线阅读,更多相关《排序二叉树.ppt(79页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、排序二叉树BinarySortTree线性表知识回顾数组静态实现链表实现线性表知识回顾数组静态实现data:arrayof1.maxnofinteger查找:顺序查找O(n)二分查找O(logn)插入:O(n)删除:O(n)数组静态实现(查找)data:arrayof1.maxnofinteger查找:顺序查找O(n)Functionsearch(x:longint):longint;返回关键字为x的节点编号,如不存在返回0vari:longint;b:boolean;Begini:=1;b:=false;while(inthensearch:=0;End;数组静态实现(查找)data:arr
2、ayof1.maxnofinteger查找:二分查找O(logn)Functionsearch(x,i,j:longint):longint;在i至j范围内查找,返回关键字为x的节点编号,如不存在返回0varm:longint;Beginifijthenbeginsearch:=0;exit;end;ifi=jthenifx=dataithensearch:=ielsesearch:=0elsebeginm:=(i+j)div2;ifx=datamthensearch:=mifdatamxthensearch:=search(x,i,m-1);ifdatamxthensearch:=searc
3、h(x,m+1,j);end;End;数组静态实现(插入)data:arrayof1.maxnofinteger插入:O(n)procedureinsert(x,k:longint):longint;将关键字为x的节点插入到k号节点前面vari:longint;Beginfori:=ndowntokdodatai+1:=datai;datak:=x;n:=n+1;End;数组静态实现(删除)data:arrayof1.maxnofinteger删除:O(n)proceduredelete(x:longint);删除k号节点vari:longint;Beginfori:=k+1tondodata
4、i-1:=datai;n:=n-1;End;线性表知识回顾链表实现data:arrayof1.maxn,1.2ofintegerdatai,2表示元素datai,1的后继编号查找:顺序查找O(n)插入:O(1)删除:O(1)data:arrayof1.maxn,1.2ofintegerFunctionsearch(x:longint):longint;返回关键字为x的节点编号,如不存在返回0,s为根结点编号vari:longint;b:boolean;Begini:=s;b:=false;repeatifdatai,1=xthenbeginsearch:=i;b:=true;endelsei:
5、=datai,2untilbordatas,2=0;ifnot(b)thensearch:=0;End;链表实现(查找O(n))data:arrayof1.maxn,1.2ofintegerprocedureinsert(x,i:longint);将关键字为x的节点插入到i号节点后面Beginn:=n+1;datan,2:=datai,2;datan,1:=x;datai,2:=nEnd;链表实现(插入O(1))data:arrayof1.maxn,1.3ofintegerdatai,3表示i号节点的父节点编号proceduredelete(i:longint);删除i号节点Beginy:=d
6、atai,3;ify=0thens:=datai,2elsedatay,2:=datai,2;End;链表实现(删除O(1))定义(递归)二叉排序树(BinarySortTree)又称二叉查找(搜索)树(BinarySearchTree)。定义:二叉排序树或者是空树,或者是满足如下性质的二叉树:若它的左子树非空,则左子树上所有结点的值均小于根结点的值;若它的右子树非空,则右子树上所有结点的值均大于根结点的值;左、右子树本身又各是一棵二叉排序树。上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。左根右特点由BST性质可得:(1)二叉排序树中任一结点x,其左(右
7、)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。(2)二叉排序树中,各结点关键字是唯一的。注意:实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的小于改为大于等于,或将BST性质(2)里的大于改为小于等于,甚至可同时修改这两个性质。(3)按中序遍历该树所得到的中序序列是一个递增有序序列。排序二叉树698752341中序遍历:123456789132231123123132排序二叉树n遍历(中序):O(n)n查找:O(logn)n插入:直接递归O(logn)n删除:O(logn)n先查找到该结点n无儿子:直接删除O(1)n单个儿子
8、:用儿子代替它O(1)n两个儿子:用后继(在右子树中一直左走)代替它排序二叉树链表实现TreeNode=recordv:longint;left,right,p:longint;end;Data:array1.maxnoflongint;排序二叉树遍历(中序):O(n)procedureprint(x:longint);beginifdatax.left0thenprint(datax.left);writeln(datax.key);ifdatax.right0thenprint(datax.right);end;注:datax.left=0表示该节点没有左子树,一般常用或者-来表示虚拟结点
9、(没有孩子)排序二叉树查找:O(logn)functionsearch(x,i:longint):boolean;关键字为x的节点是否在以i号节点为根的二叉树上beginifdatai.v=xthensearch:=trueelseifxdatai.vthenifdatax.left=0thensearch:=falseelsesearch(x,datai.left);ifxxthenifdatai.left0theninsert(datai.left,x)elsebegininc(s);datai.left:=s;datas.v:=x;endelseifdatai.right0thenins
10、ert(datai.right,x)elsebegininc(s);datai.right:=s;datas.v:=x;end;end;end;排序二叉树插入:O(logn)procedureinsert(x,i:longint);将编号为x的节点插入到以i号节点为根的二叉树中beginy:=0;whilei0dobeginy:=i;ifdatax.vdatai.vtheni:=datai.leftelsei:=datai.right;end;datax.p:=y;ify=0thenroot:=xelseifdatax.vdatay.vthendatay.left:=xelsedatay.ri
11、ght:=x;end;排序二叉树6987523415.55.55.55.55.5排序二叉树最大最小值:O(logn)functionmax(i:longint):longint;返回以i号节点为根的二叉树上的最大节点的编号beginwhiledatai.right0doi:=datai.right;max:=i;end;functionmin(i:longint):longint;返回以i号节点为根的二叉树上的最大节点的编号beginwhiledatai.left0doi:=datai.left;min:=i;end;排序二叉树687523419排序二叉树前趋:O(logn)X无左儿子X有左儿
12、子:x前趋是其左子树的最大值(1)X是其父的右儿子:x前趋是其父(2)X是其父的左儿子:找到其最低的祖先(满足是其父的右儿子),该节点的父节点是x的前趋若无这样的祖先,无后继X无父亲节点(根):无后继,x是最大节点(3)(4)X的前趋排序二叉树前趋:O(logn)functionpred(i:longint):longint;返回i号节点的前趋节点的编号,如果无后继返回0beginifdatai.left0dopred:=max(datai.left)elsebeginx:=datai.p;while(x0)and(datax.left=i)dobegini:=x;x:=datax.pend;
13、pred:=x;end;end;前趋情况(1)6987523416的前趋是其左子树的最大值56987523415的前趋是其父4前趋情况(2)912111082341前趋情况(3)676的前趋是其最近的祖先(该节点是其父节点的右儿子,若该节点是其父的左儿子则再向上追溯)8的父节点469876无前趋前趋情况(4)排序二叉树后继:O(logn)X无右儿子X有右儿子:x后继是其右子树的最小值(1)X是其父的右儿子:x前趋是其父(2)X是其父的左儿子:找到其最低的祖先(满足是其父的右儿子),该节点的父节点是x的前趋若无这样的祖先,无后继X无父亲节点(根):无后继,x是最大节点(3)(4)X的后继排序二叉
14、树后继:O(logn)functionsucc(i:longint):longint;返回i号节点的后继节点的编号,如果无后继返回0beginifdatai.right0dosucc:=min(datai.right)elsebeginx:=datai.p;while(x0)and(datax.right=i)dobegini:=x;x:=datax.pend;succ:=x;end;end;后继情况(1)6987523416的后继是其右子树的最小值715201817723611399的后继是其父节点13后继情况(2)71098523415的后继是其最近的祖先(该节点是其父节点的左儿子,若该节
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 二叉
限制150内