二、二叉排序樹結點的刪除
二叉排序樹的結點刪除要比二叉排序樹結點的插入要複雜一些,不過也並不難,要分為幾種情況進行討論。二叉排序樹結點的插入與刪除都是在查詢的基礎上來做的。下方我們就假設找到了我們要刪除的結點,根據結點含有的左右結點的個數來進行分類討論。下方會對這幾種情況進行討論。
1.刪除結點的幾種情況
(1)、刪除結點為葉子結點
刪除的結點沒有左子樹也沒有右子樹,也就是刪除的結點為葉子結點。這種情況下我們有可以細分為兩類,一種是該葉子結點就是二叉排序樹的根節點,也就是二叉排序樹中只有乙個節點的情況。只需要將root指標置為空即可。再一種情況是有刪除的葉子節點有父節點,直接將父節點連線該刪除節點的指標置空即可。示意圖如下所示:
(2)、刪除的節點只有左子樹的情況
該情況也可以細分為兩類,一種是該刪除的結點沒有父節點,也就刪除的節點為根節點,我們需要將根節點的root指標指向即將刪除結點的左孩子,然後將刪除結點的leftchild置空即可。
如果該結點有父節點,那麼將父節點相應的孩子指標指向刪除節點的左孩子,然後將刪除節點的leftchild置空。示意圖如下所示:
(3)、刪除的節點只有右子樹的情況
該情況也可以細分為兩類,一種是該刪除的結點沒有父節點,也就刪除的節點為根節點,我們需要將根節點的root指標指向即將刪除結點的右孩子,然後將刪除結點的rightchild置空即可。
如果該結點有父節點,那麼將父節點相應的孩子指標指向刪除節點的右孩子,然後將刪除節點的rightchild置空。 示意圖如下所示:
(4)、刪除的節點既有左子樹也有右子樹的情況
這種情況會稍微複雜一些,我們採用覆蓋,再刪除的方式進行解決。也就是曲線解決。直接將有左子樹也有右子樹的結點乾掉似乎不是很好實現,因為這樣會破壞二叉排序樹的結果。我們可以間接的去做。可以分為下方的兩步。
第一步:查詢刪除結點右子樹中最小的那個值,也就是右子樹中位於最左方的那個結點。然後將這個結點的值的父節點記錄下來。並且將該節點的值賦給我們要刪除的結點。也就是覆蓋。
第二步:然後將右子樹中最小的那個結點進行刪除,該節點肯定符合上述三種情況的某一種情況,所以可以使用上述的方法進行刪除。
二叉排序樹 插入 刪除 查詢
原本是想寫關於android分享功能的部落格,但是沒真機不好去測試,大白天的手機被3歲娃娃,拿去看少兒頻道了,關於二叉排序樹的定義是 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的...
二叉排序樹的查詢 插入 刪除
二叉排序樹的查詢 插入 刪除 何謂二叉排序樹 定義 二叉排序樹又稱二叉查詢樹,它或者是一顆空樹,或者是具有以下性質的二叉樹 1 若它的左子樹不空,則左子樹上所有節點的值均小於該節點的值。2 若它的右子樹不空,則右字樹上所有節點的值均大於該節點的值。3 它的左右子樹也分別為二叉排序樹。時間複雜度 o ...
二叉排序樹的查詢(插入 刪除)
近期逐步開始期末複習,在部落格上投入的精力將大幅減少大概一月左右!二叉樹的二叉鍊錶結點結構定義 typedef struct bitnodebitnode,bitree 遞迴查詢二叉排序樹t中是否存在key,指標f指向t的雙親,其初始呼叫值位null,若查詢成功,則指標p指向該資料元素結點,並返回t...