資料結構(C) 二叉排序樹的刪除和調平

2021-09-10 14:04:21 字數 1969 閱讀 1950

雖然,二叉排序樹的插入都在葉子節點,但是刪除卻可以分為三種不同的情況;

(1)刪除的節點剛好是葉子結點——直接刪除

(2)刪除的節點只有左孩子或者只有右孩子,直接讓其唯一的那個孩子去替代父母的位置

(如果24只有右孩子:不用擔心24的右孩子會不會比24的父母還大,因為如果24右孩子比24父母(45)還大,那麼在建樹的時候就會放到45的右孩子上,所以,根的左子樹上的所有節點都要比它小。)

(3)刪除的節點既有左孩子又有右孩子,兩種刪除方法

左子樹「上位」,右子樹合併到左子樹,因為右子樹上節點肯定都比左子樹上的大,所以把右子樹的根接到左子樹的最右下角。

左子樹最右下角作為最接近被刪節點的節點之一,可以直接替代子樹的父母

以上的兩種方法都可以作映象變換,比如左子樹最大對應右子樹最小

常規精簡方法

因為二叉排序樹有變成單隻樹(線性表)的風險,為了保證二叉排序樹的效率與log2n同數量級,所以要將二叉排序樹調成平衡二叉樹。

平衡二叉樹:根結點的左子樹深度-右子樹深度的絕對值不超過1。

不平衡共有以下四種情況

調平關鍵是:找到最小的非平衡二叉樹的根其平衡因子絕對值一定是2,則其之前的平衡因子絕對值一定為1,分清除不平衡的型別

(1)最小的非平衡二叉樹的根(a)的左子樹(al)的左子樹上加了節點導致其不平衡簡稱(ll型)

做法:al上去,a下來作為al的右孩子,al原本的右孩子作為a的左孩子

(2)rr型

做法:ar上去,a下來作為ar的左孩子,ar原本的左孩子作為a的右孩子

(3)lr型

①alr(a的左孩子的右孩子)上去;②al作為alr的左孩子,alr左孩子放到al的右孩子;③a作為alr的右孩子,alr的右孩子放到a的左孩子。

(4)rl型

①arl(a的右孩子的右孩子)上去;②ar作為alr的右孩子,arl右孩子放到ar的右孩子;③a作為arl的左孩子,arl的左孩子放到a的右孩子。

調平的簡單方法(不用死記硬背)

將不平的最小樹簡化成下面的模型,其中位於中間的節點直接上公升為根節點,其餘兩側的節點隨即成為它的左右孩子,原本中間節點的左右孩子,順勢掛在左右兩邊的節點上。(其中e可以表示為在空節點上插入,也可以表示成在非空節點上插)

資料結構 二叉排序樹 c

要求 1.若查詢成功,返回元素在有序陣列中的位置和查詢次數 2.若查詢失敗,返回出錯標誌和查詢次數。include using namespace std typedef int keytype typedef int infotype typedef struct elemtype typedef...

資料結構 二叉排序樹

二叉排序樹是一種特殊結構的二叉樹,它作為一種表的組織手段,通常被稱為 樹表。可以作為一種排序和檢索的手段。定義 二叉排序樹或是空樹,或是具有下述性質的二叉樹 其左子樹上所有結點的資料值均小於根結點的資料值 右子樹上所有結點的資料值均大於或等於根結點的資料值。左子樹和右子樹又各是一棵二叉排序樹。對二叉...

資料結構 二叉排序樹

二叉排序樹 binarysorttree 具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 3 左 右子樹也分別為二叉排序樹 include includeusing namespace std type...