二叉查詢樹的刪除過程:
假設要刪除樹t中的某節點z,此時對於如何刪除z要分三種情況考慮:
1. z無子女:此時直接刪除z即可
//z無子女
tree-delete0(t,z)
2. z有乙個子女:用其子節點代替自己即可
//z只有乙個子女
tree-delete1(t,z)
3. z有兩個子女:刪除z的後繼y(y不會有左子女,刪除t中的y對應情況1或2),再用y的內容代替z的內容
//z有兩個子女(這裡實際上是刪除了y)
tree-delete2(t,z)
刪除二叉查詢樹的總過程:
tree-delete(t,z)
bool bleftempty = (left[z] == null);
bool brightempty = (right[z] == null);
//左右均不為空
if(!bleftempty && !brightempty )
tree-delete2(t,z);
//左右均為空
else if(bleftempty && brightempty)
tree-delete0(t,z);
//只有乙個子女
else
tree-delete1(t,z);
}
可簡寫為:
1.確定y為要刪除的節點:若z無子女則y為z;若z僅有乙個子女則y為該子女;若z有兩個子女則y為z的後繼
if(left[z] == null || right[z] == null)
y = z;
else
y = tree-successor(z);
2.將x置為y的非空子女,若y無子女,則x置為空。若z無子女,則y為z,此時x為空;z有乙個子女,y為z,此時x為z的子女;z有兩個子女,y為z 的後繼且由二叉查詢樹性質知y最多只有乙個孩子,x為y的子女(可能為空)。綜上,x要麼為y的唯一的非空子女,要麼為空。
if(left[y] != null)
x = left[y];
else
x = right[y];
3.通過修改p[y]和x的指標刪除y。
if(x != null)
p[x] = p[y];
if(p[y] == null)
root[t] = x;
else if(y == left[p[y]])
left[p[y]] = x;
else
right[p[y]] = x;
4.如果z有兩個子女,則z的後繼是要被刪除的節點,應將y中的內容複製置z:
if(y != z)
key[z] = key[y];
即:
tree-delete(t,z)
二叉樹詳解
一 簡介 世界上的樹有千萬種,我們這裡來學習我們資料結構中的樹,它是我們現實生活中倒置的樹。之前,我們學習的順序表,鍊錶,棧 和佇列。可以說都是我們的線性結構,也就是我們所謂的一對一的結構,可是現實生活中,我們經常碰到是我們一對多的情況。今天,我們就來研究一下這種一對多的資料結構體 樹 那麼,什麼叫...
二叉樹詳解
一 二叉樹的一些概念 二叉樹就是每個結點最多有兩個子樹的樹形儲存結構。先上圖,方便後面分析。1 滿二叉樹和完全二叉樹 上圖就是典型的二叉樹,其中左邊的圖還叫做滿二叉樹,右邊是完全二叉樹。然後我們可以得出結論,滿二叉樹一定是完全二叉樹,但是反過來就不一定。滿二叉樹的定義是除了葉子結點,其它結點左右孩子...
二叉樹詳解
樹是一種比較重要的資料結構,尤其是二叉樹。二叉樹是一種特殊的樹,在二叉樹中每個節點最多有兩個子節點,一般稱為左子節點和右子節點 或左孩子和右孩子 並且二叉樹的子樹有左右之分,其次序不能任意顛倒。本篇部落格將詳細為大家解析二叉樹。首先介紹兩個概念 滿二叉樹 在一棵二叉樹中,如果所有分支結點都有左孩子和...