999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

二叉排序樹上刪除結(jié)點(diǎn)算法的研究

2014-02-12 22:45:23黃淑芹
關(guān)鍵詞:排序

黃淑芹,張 海

(安徽財(cái)經(jīng)大學(xué) 管理科學(xué)與工程學(xué)院, 安徽 蚌埠 233030)

1 二叉排序樹的相關(guān)概念

二叉排序樹是一種特殊的二叉樹,當(dāng)不允許有重復(fù)值時(shí),二叉排序樹定義為:

二叉排序樹可以是一棵空樹;或者是滿足如下特性的二叉樹:若它的左子樹不空,則左子樹上所有結(jié)點(diǎn)的值均小于根結(jié)點(diǎn)的值;若它的右子樹不空,則右子樹上所有結(jié)點(diǎn)的值均大于根結(jié)點(diǎn)的值;它的左、右子樹也都分別是二叉排序樹.

可見,二叉排序樹是一種遞歸定義.當(dāng)中序遍歷二叉排序樹時(shí)可以得到一個(gè)遞增排序序列.

二叉排序樹的類型定義:

typedef struct BNode { // 結(jié)點(diǎn)結(jié)構(gòu)

KType key;

struct BNode *lchild, *rchild;

} BNode, *BTree;

查找、插入和刪除是二叉排序樹的重要操作.為了更好地分析刪除操作和查找操作的關(guān)系,引入另一種刪除操作思路,為了與文獻(xiàn)[1]刪除操作的實(shí)現(xiàn)思路更好地比較.下面首先分析文獻(xiàn)[1]的刪除思路.

2 借助遞歸和引用實(shí)現(xiàn)二叉排序樹上的刪除算法

在文獻(xiàn)[1]中,詳細(xì)描述了查找算法Search和插入算法Insert,并且處理插入操作時(shí)是基于查找算法Search實(shí)現(xiàn)的.即如果查找不成功則插入.

If (!Search(T,key,NULL,p) )

則插入結(jié)點(diǎn);

但文獻(xiàn)[1]在處理刪除操作時(shí),沒有調(diào)用Search查找算法,而是巧妙地借助C++中的引用,單獨(dú)建立了一個(gè)刪除算法,在該算法中實(shí)現(xiàn)查找,查找成功則刪除,也就是邊查找邊刪除.

刪除結(jié)點(diǎn)和其雙親結(jié)點(diǎn)的關(guān)系是通過遞歸和引用[2]實(shí)現(xiàn)的.通過Delete(T->lchild,key)、 Delete(T->rchild,key)遞歸調(diào)用算法Delete(T,key)時(shí),因?yàn)門->lchild和T->rchild一定是T的孩子,并且借助于Del(&p)算法中的引用把“父子關(guān)系”帶到遞歸的下一層.為了便于比較,其刪除算法如下:

Status Delete (BTree &T, KType key ) {

if (!T) return FALSE; // 不存在key元素

else { if (key==T->key) //存在key元素

return Del(T);

else if (keykey)

return Delete ( T->lchild, key ); //繼續(xù)查找左子樹

else return Delete ( T->rchild, key ); // 繼續(xù)查找右子樹

}

} // Delete

void Del ( BTree &p ){ //借助于引用,T向下層遞進(jìn)

if (!p->rchild) { // 右子樹為空樹時(shí)

q = p; p = p->lchild; free(q);

}

else if (!p->lchild) { // 左子樹為空樹時(shí)

q = p; p = p->rchild; free(q);

}

else { // 左右子樹均不空

q = p; s = p->lchild;

while (s->rchild) { q = s; s = s->rchild; } // s 指向被刪結(jié)點(diǎn)的前驅(qū)

p->key = s->key;

if (q != p ) q->rchild = s->lchild;

else q->lchild = s->lchild;

delete s;

}

return TRUE;

} // Del

3 基于Search查找算法的刪除算法

因?yàn)榻滩亩x了Search查找算法,在查找不成功時(shí)插入結(jié)點(diǎn).大家自然地認(rèn)為是當(dāng)查找成功時(shí)便刪除結(jié)點(diǎn),同樣要調(diào)用查找算法.即:

if (!Search(T,key,NULL,p))

則插入結(jié)點(diǎn);

else

則刪除結(jié)點(diǎn);

并且文獻(xiàn)[1]詳細(xì)地描述了被刪的結(jié)點(diǎn)與其雙親結(jié)點(diǎn)指針的變化,即:

(1)如果被刪的結(jié)點(diǎn)為葉子結(jié)點(diǎn),則將其雙親結(jié)點(diǎn)中相應(yīng)指針設(shè)為“空”即可.

(2)如果被刪的結(jié)點(diǎn)只有左子樹或右子樹,則將其雙親結(jié)點(diǎn)的相應(yīng)指針設(shè)為指向被刪結(jié)點(diǎn)的左子樹或右子樹即可.

(3)如果被刪的結(jié)點(diǎn)既有左子樹又有右子樹,則用中序遍歷該樹時(shí)被刪結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)替代它,再從樹中刪除前驅(qū)結(jié)點(diǎn).

而在實(shí)際刪除算法中卻用了遞歸和引用實(shí)現(xiàn)刪除結(jié)點(diǎn)時(shí)雙親指針的變化,沒有顯式地體現(xiàn)刪除結(jié)點(diǎn)時(shí)雙親指針的變化,這就給很多讀者帶來了疑惑,甚至有的讀者沒有讀懂文獻(xiàn)[1]的刪除算法,認(rèn)為刪除結(jié)點(diǎn)時(shí)沒有正確地修改雙親結(jié)點(diǎn)的指針,是錯(cuò)誤的[3].

為了便于大家更好地理解二叉排序樹上的刪除操作,和二叉排序樹上的插入操作思路保持一致(插入算法Insert中調(diào)用了查找算法Search,在刪除算法中也調(diào)用查找Search算法),這里提出了刪除操作的另一種算法,在實(shí)現(xiàn)該算法前,要先修改查找算法Search.因?yàn)樵谖墨I(xiàn)[1]的查找算法Search中,指針f指向T的雙親,由于在算法內(nèi)沒有像給p賦值(如p=f或p=T)一樣給f單獨(dú)賦值,f值是不能帶給其他函數(shù)的,且f所指并不是p的雙親.為了查找成功實(shí)現(xiàn)刪除時(shí),正確地修改雙親結(jié)點(diǎn)的指針,必須能使p的雙親保存下來,并能帶回刪除算法.

為此修改文獻(xiàn)[1]的查找算法Search為Search2,算法如下:

Status Search2(BTree T, KType key,BTree f, BTree &p,BTree &f2 ) {

if (!T)

{ p=f; return FALSE; } // 沒找到key元素

else if ( key==T->key)

{ p = T; f2=f; return TRUE; } // 找到key元素

else if ( keykey)

{return Search(T->lchild, key, T, p,f2);} //繼續(xù)查找左子樹

else {return Search(T->rchild, key, T, p,f2);} //繼續(xù)查找右子樹

}

在查找算法Search2中,增設(shè)了一個(gè)指向*p的雙親*f2參數(shù),當(dāng)查找成功f2始終指向*p的雙親結(jié)點(diǎn),并使用引用將其值帶入刪除算法,當(dāng)p指向根節(jié)點(diǎn)時(shí),f2為NULL.算法中語句f2=f是必須的,否則后面的刪除算法Delete2中的f2不能正常使用.

基于查找算法Search2的刪除算法修改如下:

Status Delete2(BTree &T, KType key)

{ if(Search2(T,key,f,p,f2))

{if (!p->rchild) //右子樹為空樹時(shí)

{ if (p==T) T=p->lchild;//刪除的結(jié)點(diǎn)為根節(jié)點(diǎn)

else if(p==f2->lchild)

f2->lchild=p->lchild;

else f2->rchild=p->lchild;

free(p);}

else if (!p->lchild) //左子樹為空樹時(shí)

{ if (p==T) //刪除結(jié)點(diǎn)為根結(jié)點(diǎn)

T=p->rchild;

else if(p==f2->lchild)

f2->lchild=p->rchild;

else f2->rchild=p->rchild;

free(p);}

else { //左右子樹都不空時(shí)

q = p; s = p->lchild;

while (s->rchild) { q = s; s = s->rchild; }

p->key = s->key;

if(q!=p)q->rchild=s->lchild;

else q->lchild = s->lchild;

free(s);}

return TRUE;

}

return FALSE;

}

4 結(jié)束語

本文就文獻(xiàn)[1]在二叉排序樹上的刪除操作給予了詳細(xì)地分析和比較,并提出了基于查找算法的刪除算法,一方面旨在幫助大家理解遞歸和引用在算法中的巧妙應(yīng)用,另一方面和插入算法的思路保持了統(tǒng)一性,使大家更好地理解刪除算法.希望本文對同仁的數(shù)據(jù)結(jié)構(gòu)課程教學(xué)有所幫助.

參考文獻(xiàn):

[1]嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].清華大學(xué)出版社,1997:227-231.

[2]譚浩強(qiáng).C++程序設(shè)計(jì)[M].清華大學(xué)出版社,2011:186-188.

[3]陳建國. 在二叉排序樹上刪除一個(gè)結(jié)點(diǎn)的算法改進(jìn)[J].太原科技,2001(1):27-28.

猜你喜歡
排序
排排序
排序不等式
作者簡介
名家名作(2021年9期)2021-10-08 01:31:36
作者簡介
名家名作(2021年4期)2021-05-12 09:40:02
作者簡介(按文章先后排序)
名家名作(2021年3期)2021-04-07 06:42:16
恐怖排序
律句填空排序題的備考策略
節(jié)日排序
刻舟求劍
兒童繪本(2018年5期)2018-04-12 16:45:32
作者簡介(按文章先后排序)
名家名作(2017年2期)2017-08-30 01:34:24
主站蜘蛛池模板: 91成人在线观看视频| 无码高潮喷水专区久久| 波多野结衣AV无码久久一区| 亚洲无码精彩视频在线观看| 永久免费无码日韩视频| 国产va视频| 国产制服丝袜无码视频| 亚洲首页在线观看| 国产精品三级专区| 中国成人在线视频| 亚洲人成人伊人成综合网无码| 激情综合图区| 一级爆乳无码av| 无码福利视频| 国产99精品久久| AV不卡在线永久免费观看| 欧美 国产 人人视频| 欧美全免费aaaaaa特黄在线| 午夜爽爽视频| 国产精品私拍99pans大尺度 | 国产福利观看| 五月婷婷导航| 免费播放毛片| 小说 亚洲 无码 精品| 青青草原偷拍视频| 色婷婷综合在线| 欧美a在线视频| 亚洲青涩在线| 97青青青国产在线播放| 无码有码中文字幕| 欧美色视频日本| 日韩a级毛片| 666精品国产精品亚洲| 91国内在线观看| 91精品伊人久久大香线蕉| 少妇精品久久久一区二区三区| 国产91在线|中文| 国产精品第一区在线观看| 久久青草精品一区二区三区 | 国产欧美日韩免费| 狠狠色噜噜狠狠狠狠色综合久 | 亚洲人成人无码www| 97国内精品久久久久不卡| 依依成人精品无v国产| 在线观看91香蕉国产免费| 日韩美毛片| 美女无遮挡被啪啪到高潮免费| 99视频只有精品| 一本色道久久88| A级全黄试看30分钟小视频| 久久久精品久久久久三级| 亚洲va精品中文字幕| 92精品国产自产在线观看| 91视频首页| 欧美激情第一欧美在线| 亚洲无码免费黄色网址| 免费大黄网站在线观看| 久久青青草原亚洲av无码| JIZZ亚洲国产| 在线视频一区二区三区不卡| 国产精品深爱在线| 国产一区在线观看无码| 国产女人水多毛片18| 国产成人综合欧美精品久久| 欧美精品在线看| 国产伦精品一区二区三区视频优播| 日本高清视频在线www色| 欧美日韩一区二区在线播放 | 亚洲一区二区三区国产精华液| 手机精品视频在线观看免费| 亚洲欧洲日产国产无码AV| 亚洲精品亚洲人成在线| 亚洲一区二区三区香蕉| 夜夜高潮夜夜爽国产伦精品| 国产精品久久久久久久久久久久| 国产一区二区三区免费观看| 亚洲乱码在线播放| 国产成人1024精品| 精品久久蜜桃| 亚洲色欲色欲www网| 国产麻豆va精品视频| 欧美一区国产|