二叉搜尋樹的前驅和後繼詳細推導

2022-05-06 17:54:19 字數 2531 閱讀 3403

後繼和前驅

定義:乙個結點的後繼,是大於x.key的最小關鍵字的結點。

乙個結點的前驅,是小於x.key的最大關鍵字的結點。

思路:找乙個結點的前驅或者後繼,無非是在三個區域找。

首先分析前驅:

滿足兩個條件,一是要小於當前鍵值,那麼只有lp和ls區可以找。

二要求是其中最大的值。我們知道,對於lp來說,x、ls、rs都屬於他的右子樹,那麼,x、ls和rs都是大於它的。

所以很顯然,前驅就是ls中的最大值,即前驅 = 左子樹中的最大值條件是:存在左子樹。

那不存在左子樹只有左父母的情況呢?

那只能在lp上找了,lp也具有兩部分,第一部分是lp的ls,lp的ls雖然滿足小於x的條件,但是lp的ls中所有元素都是小於lp的,所以至少也是lp。

還有一部分,lp可能有左父母或者右父母,顯然,右父母大於他的所有左子樹,包括x,條件一都不滿足,顯然不行。左父母小於lp,所以它競爭不過lp。

所以最終結論就是,在只有左父母,沒有左子樹的情況,前驅 = 左父母的值。

那不存在左子樹和左父母的情況呢?

那就只剩下右子樹和右父母了,顯然,右子樹肯定不行,它的所有元素都大於x。那就只能在右父母中找了,畢竟雖然右父母大於它,但是右父母也有左/右父母和右子樹。

右父母的右父母,和右子樹都不行,都大於右父母本身,更大於x了。那就只能在右父母的左父母上找了,對於左父母來說,他的右子樹全都大於他,即包括x的右父母和x,所以,此時找到的左父母就是我們的前驅。

所以,不存在左子樹和左父母的情況,前驅 = 右父母的左父母(如果右父母不存在左父母,就一直往上遍歷,直至出現左父母)。

分析完畢。下面是**實現。

因為我們的二叉樹的結點只有left和right指標,所以這題感覺要用遞迴來做,或者棧。下面我們用棧寫乙個吧(時間複雜度是o(n))

bintree predecessor(bintree x,bintree bst)

bintree par,son;

son =x;

while((par = pop(s))->right!=son)son = par;//

相當於case2&3結合,直至找到左母親為止。

return

par;}}

插播乙個遞迴和棧的區別:

接著分析後繼:(模擬前驅,如果前驅看懂了可以不用看,基本上是一樣的分析思路)

滿足兩個條件,一是要大於當前鍵值,那麼只有rp和rs區可以找。

二要求是其中最小的值。我們知道,對於rp來說,x、ls、rs都屬於他的左子樹,那麼,x、ls和rs都是小於它的。

所以很顯然,前驅就是rs中的最小值,即後繼 = 右子樹中的最小值。條件是:存在右子樹。

那不存在右子樹只有右父母的情況呢?

那只能在rp上找了,rp也具有兩部分,第一部分是lp的rs,rp的rs雖然滿足大於x的條件,但是rp的rs中所有元素都是大於lp的,所以找後繼,至少也得是rp。

還有一部分,rp可能有左父母或者右父母,顯然,左父母小於他的所有右子樹,包括x,條件一都不滿足,顯然不行。右父母大於rp,所以它競爭不過rp。

所以最終結論就是,在只有右父母,沒有右子樹的情況,後繼 = 右父母的值。

那不存在右子樹和右父母的情況呢?

那就只剩下左子樹和左父母了,顯然,左子樹肯定不行,它的所有元素都小於x。那就只能在左父母中找了,畢竟雖然左父母小於它,但是右父母也有它本身的左/右父母和左子樹。

左父母的左父母,和左子樹都不行,都小於左父母本身,更小於x了。那就只能在左父母的右父母上找了,對於它的右父母來說,他的左子樹全都小於他,即包括x的左父母和x,所以,此時找到的右父母就是我們的後繼。

所以,不存在右子樹和右父母的情況,後繼 = 左父母的右父母(如果左父母不存在右父母,就一直往上遍歷,直至出現右父母)。

分析完畢。下面是**實現,同樣是用棧實現。

bintree successor(bintree x,bintree bst)

bintree par,son;

son =x;

while((par = pop(s))->left!=son )son =par;

return

par;}}

基本上是一樣的。

找尋二叉搜尋樹的前驅和後繼節點

找尋節點的前驅節點 public node predecessor node node return p 2.節點的左子樹不存在 while node.parent null node node.parent.left return node.parent 找尋節點的後繼節點 public node...

二叉樹遍歷的前驅和後繼

下面關於二叉樹三種遍歷方法的前驅和後繼作討論和總結。一 前序遍歷1.1 找後繼 若有左子女,則後繼是左子女 若無左子女,有右子女,則後繼是右子女 若既無左子女,又無右子女,則是一片葉子 若是其父母的左子女,且父母有右子女,則後繼是父母的右子女。若是其父母的左子女,且父母無右子女 若是其父母的右子女。...

樹和二叉樹4 前驅和後繼

二叉樹的幾何結構和遍歷路徑,是查詢前驅和後繼的基礎。幾何結構千變萬化,但單個結點必然和至多3點鄰接 左 或右 父,左子和右子。按照 x 型助記,交叉點為研究物件。為求結點n的前驅結點p和後繼結點s,設n的左子l,右子r和父f fl,f的左子,fr,f的右子 若n是f的左子,則f是n的右父 若n是f的...