二叉排序樹
又稱二叉查詢樹,它或者是一棵空樹,或者是具有下列性質的二叉樹:
若它的左子樹不為空,則左子樹上所有結點的值均小於它的根結點的值。
若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值。
它的左右子樹,也分別為二叉排序樹。
構造一棵二叉排序樹的目的,不是為了排序,而是為了提高查詢、插入刪除關鍵字的速度。
二叉樹的刪除,需要保證一點,不能因為刪除了結點,而讓這棵樹變得不滿足二叉排序樹的特性,所以需要分幾種情況:
如果要刪除的結點是葉子結點,可直接刪除,對樹的其他結點沒有影響。
如果要刪除的結點,只有左孩子,或者只有右孩子,這個結點被刪除後,將它的左孩子,或者右孩子整個移動到刪除結點的位置。
如要刪除的結點既有左孩子,又有右孩子,這種情況要複雜一些:
首先,我們在其左孩子,右孩子兩棵樹中,找乙個最接近這個結點值的數,用這個數替換要刪除的結點;
然後,在一棵二叉排序中,最接近某個結點值的數通常有兩個,乙個比它大的,乙個比它小的,也就是對二叉排序樹中序遍歷後,得到乙個序列,最接近它的兩個數,剛好是這個數的前驅和後繼。
結點刪除的圖示;
二叉排序樹的結構定義,及**實現:
#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 不能採用...