您好,登錄后才能下訂單哦!
本文介紹什么?
使用伸展樹有什么樣的效果;
伸展樹的定義;
伸展樹ADT具體實現過程的描述;
代碼實現。
一、使用伸展樹(splay tree)的效果:
使用伸展樹時,對伸展樹上任意一次操作的最壞運行時間為 O( N );但是,它保證了連續M次操作花費的最多時間為O(M ㏒N),從而可以推算出對伸展樹的每一次操作的攤還時間為O( ㏒N)。
二、伸展樹的定義:
對于一顆二查查找樹進行操作時,每訪問一個節點,該節點都通過旋轉操作被放到根上。這樣的一顆二查查找樹稱為伸展樹。
三、伸展樹ADT的描述:
1.伸展樹的節點定義與二查查找樹節點定義的方法一致,此處不再贅述;
2.比起二查查找樹,伸展樹ADT只是對了一個旋轉操作。在這里的旋轉,我們稱之為展開(Splaying)。設節點X為訪問的節點,我們通過對節點X進行一系列操作,將節點X移動到根節點。
3.節點X旋轉的情況:
⑴節點X為根節點:什么都不做;
⑵節點X的父節點為根節點:
根節點的左子樹=X的右子樹;
X的右子樹=根節點;
⑶節點X具有父節點(P)、祖父節點(G),此時有(兩類)四種情況需要考慮:
ⅰ、( "一" 字形) P是G的左兒子,X是P的左兒子;
ⅱ、( "一" 字形)P是G的右兒子,X是P的右兒子;
ⅲ、( "之" 字形)P是G的左兒子,X是P的右兒子;
ⅳ、( "之" 字形)P是G的右兒子,X是P的左兒子;
4.節點的刪除:
由于對節點X的每一次訪問都需要將X移向根節點,所以懶惰刪除在這里顯得不太合適,在這里需要進行的直接刪除。當進行刪除操作時,首先需要訪問節點X,節點X被移動到根節點,此時刪除X花費的代價是比較小的。在刪除節點X的時候,①訪問X導致節點X被移向根節點,刪除節點X并得到左、右兩棵子樹(TL、TR);②在右子樹TR上訪問最小節點Y(該節點一定沒有左兒子),將Y移動到右子樹的根節點;③令Y的左兒子為左子樹TL。
四、核心代碼實現:
1.伸展樹的伸展實現
ⅰ、( "一" 字形) P是G的左兒子,X是P的左兒子;
操作:
G的左兒子=P的右兒子;
P的右兒子=G;
P的左兒子=X的右兒子;
X的右兒子=P;
//一字形(左左) static Position ZigzigLL(Position g) { Position p,x; p=g->left;x=p->left; g->left=p->right; p->right=g; p->left=x->right; x->right=p; return x; }
ⅱ、( "一" 字形)P是G的右兒子,X是P的右兒子;
操作:
G的右兒子=P的左兒子;
P的左兒子=G;
P的右兒子=X的左兒子;
X的左兒子=P;
//一字形(右右) static Position ZigzigRR(Position g) { Position p,x; p=g->right;x=p->right; g->right=p->left; p->left=g; p->right=x->left; x->left=p; return x; }
ⅲ、( "之" 字形)P是G的左兒子,X是P的右兒子;
操作:
G的左兒子=X的右兒子;
X的右兒子=G;
P的右兒子=X的左兒子;
X的左兒子=P;
//一字形(左右) static Position ZigzigLR(Position g) { Position p,x; p=g->left;x=p->right; g->left=x->right; x->right=g; p->right=x->left; x->left=p; return x; }
ⅳ、( "之" 字形)P是G的右兒子,X是P的左兒子;
操作:
G的右兒子=X的左兒子;
X的左兒子=G;
P的左兒子=X的右兒子;
X的右兒子=P;
//一字形(右左) static Position ZigzigRL(Position g) { Position p,x; p=g->right;x=p->left; g->right=x->left; x->left=g; p->left=x->right; x->right=p; return x; }
3.伸展樹的刪除操作實現
//刪除節點 void Delete(const ElementType x,const sTree st) { if(NULL==st) printf("該樹為空樹\n"); else{ position temp=Find(x,st); Position root=FindMin(temp->right); root->left=temp->left; free(temp); temp=NULL; return ; } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。