查詢演算法 樹表查詢之二叉排序樹

2021-09-02 10:21:10 字數 2420 閱讀 2571

從前面介紹的查詢方法我們知道,折半查詢較順序查詢速度快,但折半查詢要求表中記錄必須有序,

因為當在已排序的表中找到新記錄恰當的位置時,需要移動許多記錄以便為新記錄騰出位置。有沒有哪一種組織記錄的方法使得記錄的插入與查詢都能夠很快地完成呢?本篇部落格介紹的樹表查詢就能解決這個問題。

二叉排序樹(bst 也叫二叉查詢樹)

定義:

二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:

(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

(2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;

(3)左、右子樹也分別為二叉排序樹;

根據bst的性質可以推出,中序遍歷該樹所得到的是乙個遞增序列

樣式:

即根結點大於左子樹,小於等於右子樹。

二叉排序樹生成和結點插入

二叉排序樹生成是從乙個空樹開始的,每插入乙個關鍵字,就可以呼叫一次插入方法。所以,先寫出二叉排序樹的插入方法,要保證插入後滿足bst的性質。

定義樹結點的結構為:

//結點結構

struct node

};

插入函式**為:

//二叉排序樹節點插入

int insert(node * &root,int key)

else if(key==root->key)//已經存在

return 0;//插入失敗

else if(keykey)//插到左子樹

return insert(root->lchild,key);

else

return insert(root->rchild,key);

}

有了插入**,生成二叉排序樹的**就簡單了:

//二叉排序樹建立

void create(node * &root)

;//結點資料

for(int i=0;i<9;i++)

insert(root,a[i]);//節點插入

}

至此我們就生了一棵二叉排序樹如下:

需要注意的是資料順序不同, 生成的二叉排序樹可能不同,你可以試試資料

int a=;
很明顯不一樣,我們需要知道構造高度越小的二叉排序樹,查詢的效率越高

二叉排序樹查詢

生成二叉排序樹後,我們來試試查詢6這個結點,查詢到就返回該結點的指標,否則返回null;

**如下:

//節點查詢

node * search(node * root,int key)

從查詢的平均效能來說,二叉排序樹和二分查詢差不多,但在維護表的有序性上,二叉排序樹更有效,因為無需記錄,只需修改指標。

二叉排序樹刪除

刪除結點後,我們還要保證它的bst性質。更不能把它的子結點丟棄。這裡我們很容易想到直接刪除此結點和其子結點,在迴圈呼叫insert函式把它的子結點插入進去。

另一種方法就要分四種情況討論了:

1.若要刪除的是葉子結點,直接刪除該結點

2.若要刪除的結點只有左子樹而無右子樹,可直接將其左子樹的根節點放在被刪除的位置

3.若要刪除的結點只有右子樹而無左子樹,可直接將其右子樹的根節點放在被刪除的位置

4.若要刪除的結點有左右子樹,可以從其左子樹種選擇最大的結點或從右子樹中選擇最小的結點放到被刪的結點的位置

根據分析,我們就能寫出**,注意使用引用型別,因為要對樹本身進行操作:

int delete(node * &root,int key)

else if(root->rchild==null)//沒有右子樹。

else if(root->lchild==null)//沒有左子樹

//有左右子樹

else

return 1;

} }}

void delete2(node * & root, node * & right)//要用引用型別,因為要對樹本身操作

}

動態查詢之 二叉排序樹

從圖上可得出二叉排序樹的基本概念。左子樹小於根,右子樹大於根 中序遍歷後有序 樹中最小的樹在最左邊,最大的在最右邊 這裡主要分析一下二叉排序樹的插入和刪除。pcur new node key,value if key pparent key else if key pparent key 這裡只擷取...

查詢表 二叉排序樹

資料結構實驗之查詢一 二叉排序樹 time limit 400 ms memory limit 65536 kib problem description 對應給定的乙個序列可以唯一確定一棵二叉排序樹。然而,一棵給定的二叉排序樹卻可以由多種不同的序列得到。例如分別按照序列和插入初始為空的二叉排序樹,...

查詢演算法 二叉排序樹

二叉排序樹,又稱二叉查詢樹,是一種對排序和查詢都很有用的特殊二叉樹 定義二叉排序樹或者是一棵空樹,或者具有以下定義 1 若左子樹不為空,左子樹上所有結點值均小於根結點值 2 若右子樹不為空,右子樹上所有結點值均大於根結點值 3 左右子樹也分別為二叉排序樹。遞迴定義。有定義可得性質 中序遍歷二叉樹可得...