資料結構系列,二叉排序樹的結點刪除 重排

2021-10-02 03:02:34 字數 3391 閱讀 6626

二叉排序樹

又稱二叉查詢樹,它或者是一棵空樹,或者是具有下列性質的二叉樹:

若它的左子樹不為空,則左子樹上所有結點的值均小於它的根結點的值。

若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值。

它的左右子樹,也分別為二叉排序樹。

構造一棵二叉排序樹的目的,不是為了排序,而是為了提高查詢、插入刪除關鍵字的速度。

二叉樹的刪除,需要保證一點,不能因為刪除了結點,而讓這棵樹變得不滿足二叉排序樹的特性,所以需要分幾種情況:

如果要刪除的結點是葉子結點,可直接刪除,對樹的其他結點沒有影響。

如果要刪除的結點,只有左孩子,或者只有右孩子,這個結點被刪除後,將它的左孩子,或者右孩子整個移動到刪除結點的位置。

如要刪除的結點既有左孩子,又有右孩子,這種情況要複雜一些:

首先,我們在其左孩子,右孩子兩棵樹中,找乙個最接近這個結點值的數,用這個數替換要刪除的結點;

然後,在一棵二叉排序中,最接近某個結點值的數通常有兩個,乙個比它大的,乙個比它小的,也就是對二叉排序樹中序遍歷後,得到乙個序列,最接近它的兩個數,剛好是這個數的前驅和後繼。

結點刪除的圖示;

二叉排序樹的結構定義,及**實現:

#ifndef data_structure_binary_sort_tree_class_h

#define data_structure_binary_sort_tree_class_h

#define ok 1

#define error 0

#define true 1

#define false 0

#define maxsize 100 //儲存空間初始分配量

#define max_tree_size 100 //二叉樹最大結點樹

typedef int status; //表示函式結果的狀態碼

typedef int treeelemtype; //樹節點的資料型別,暫定int

typedef treeelemtype sqbitree[max_tree_size]; //順序儲存結構陣列

typedef struct bitnode bitnode, *bitree;

treeelemtype nil = 0; //表示空元素

status delete(bitree *p);

#endif

#include "binarysorttree.h"

#include "iostream"

#include "cstdlib"

#include "cmath"

using namespace std;

#define arraylength(array) sizeof(array) / sizeof(array[0])

const int array[11] = ;

/**二叉排序樹的查詢,樹t中是否存在key

*指標f指向t的雙親,其初始值為空

* 若查詢成功,指標p返回指向該資料元素結點,放回true

*否則指標p指向查詢路徑的最後乙個結點,返回false

*/status searchbst(bitree t, int key, bitree father, bitree *p) else if (key == t->data) else if (key < t->data) else }/*

*二叉排序樹的插入,當樹t中不存在key,插入key返回true,否則返回false

*因為二叉樹會被修改,所以這裡用了指標

*/status insertbst(bitree *t, int key) else if (key < p->data) else

return true;

} else }/*

* 這裡的引數,是乙個指標常量,不能通過這個指標常量修改指標指向的常量的內容,

* 但是指標的指向是可以改變的,就是說這個指標常量還可以指向別的地方。

*/status createbst(bitree *t, const int *p, int lenth) else }/*

* 二叉排序樹的刪除

* 若二叉排序中存在結點值等於key的資料元素,則刪除該結點,並返回true,否則返回flase

*/status deletebst(bitree *t, int key) else else if (key < (*t)->data) else }}

/**刪除結點,重排它的左右子樹

*/status delete(bitree *p) else if (null == (*p)->rchild) else

//3,用s替換被刪除的結點

(*p)->data = s->data;

if (q != *p) else

delete s;

} return true;

}int main()

/*output*/

g++ -g binarysorttree.cpp -o bstree

./bstree

lenth=11,,,i=0,v= 62

lenth=11,,,i=1,v= 88

lenth=11,,,i=2,v= 58

lenth=11,,,i=3,v= 47

lenth=11,,,i=4,v= 35

lenth=11,,,i=5,v= 73

lenth=11,,,i=6,v= 51

lenth=11,,,i=7,v= 99

lenth=11,,,i=8,v= 37

lenth=11,,,i=9,v= 93

lenth=11,,,i=10,v= 36

value=35

value=36

value=37

value=47

value=51

value=58

value=62

value=73

value=88

value=93

value=99

after delete the node :47

value=35

value=36

value=37

value=51

value=58

value=62

value=73

value=88

value=93

value=99

資料結構 二叉排序樹

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

資料結構 二叉排序樹

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

資料結構 二叉排序樹

如果需要乙個滿足 支援排序性 高效插入 刪除操作 高效查詢的資料結構,怎麼做?先看看一些簡單的資料結構 1 排序順序表 陣列 查詢可以採用折半查詢演算法,時間效率為o log2n 插入 刪除操作的時間複雜度為o n 資料量大時,效率太低。2 排序單鏈表 只能採用順序查詢,時間複雜度為o n 不能採用...