二叉樹刪除詳解

2021-06-27 11:07:55 字數 1626 閱讀 7879

二叉查詢樹的刪除過程:

假設要刪除樹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 滿二叉樹和完全二叉樹 上圖就是典型的二叉樹,其中左邊的圖還叫做滿二叉樹,右邊是完全二叉樹。然後我們可以得出結論,滿二叉樹一定是完全二叉樹,但是反過來就不一定。滿二叉樹的定義是除了葉子結點,其它結點左右孩子...

二叉樹詳解

樹是一種比較重要的資料結構,尤其是二叉樹。二叉樹是一種特殊的樹,在二叉樹中每個節點最多有兩個子節點,一般稱為左子節點和右子節點 或左孩子和右孩子 並且二叉樹的子樹有左右之分,其次序不能任意顛倒。本篇部落格將詳細為大家解析二叉樹。首先介紹兩個概念 滿二叉樹 在一棵二叉樹中,如果所有分支結點都有左孩子和...