二叉搜尋樹是以一棵二叉樹來組織的。在二叉樹的基礎上,增加了一些限制:
對於任何結點x,其左子樹的任何結點都不大於x.key,右子樹的任何結點都不小於x.key。
二者都是基於二叉樹來構建的資料結構,但是二者的區別在於:
二叉堆(最大堆)的每個結點的值都大於等於其兩個兒子的值,二叉查詢樹的父親是小於等於其右孩子的。如下圖:
(一)查詢:tree_search
輸入引數:指向根結點的指標和要查詢的關鍵字
返回值:如果存在該關鍵字,則返回關鍵字所在的結點。否則返回空
該過程從根結點開始查詢,並沿著該樹的一條路徑向下進行。由於二叉搜尋樹要求每個結點是有序的,所以該過程十分類似二叉檢索。
(二)最大最小關鍵字元素tree_maximum、tree_minimum
輸入引數:二叉搜尋樹中的某一結點
返回值:以該指標為根的子樹中的最大或最小結點
該過程也是利用了二叉搜尋樹的性質,可以快速地定位最大最小值。
(三)後繼和前驅tree_successor、tree_predecessor
輸入引數:二叉搜尋樹中的某一結點
返回值:該結點的前驅結點和後繼結點
後繼指比該元素大的下乙個元素。如果是右子樹非空,就返回右子樹中的最左結點。否則就是該結點所有有左孩子的祖先結點中的最底層祖先。
前驅指比該元素小的下乙個元素,其原理跟後繼一樣。
(四)插入tree_insert
輸入引數:要插入的結點、根結點
返回值:空
根據二叉搜尋樹的性質,找到該結點應放置的位置。可從根結點依次向下遍歷,直到找到該元素適合的位置。
(五)刪除tree_delete
輸入引數:要刪除的結點、根結點
返回值:空
刪除的結點需要分一下三種情況考慮:
①左子樹、右子樹都沒有,即葉子結點:直接刪除
②左子樹、右子樹二者有其一:將其子樹直接連線在其父結點上
③左子樹、右子樹二者都有:首先刪除其後繼,並讓後繼的父結點成為後繼的右子樹的父結點,再將後繼的值代替要刪除結點的值
實現**如下:
[cpp]view plain
copy
#include
using
namespace
std;
struct
node
; node tree_search( node* x, int
k )
node tree_maximum( node* x )
node tree_minimum( node* x )
node tree_successor( node* x )
return
y;
} void
tree_insert( node* z, node* root )
z->parent = y;
if( y == null )
root = z;
else
if( z->key key )
y->left = z;
else
y->right = z;
} void
tree_delete( node *z, node* root )
}
《演算法導論》筆記 二叉搜尋樹
演算法 資料結構 二叉搜尋樹 binary search tree 是經過一定地組織形成的有特定結構特徵的二叉樹,支援各種動態集合 dynamic set 操作 如insert delete maximum minimum等等 這些操作的時間複雜度與樹的高度成正比。一棵有n個節點的完全二叉樹 com...
二叉搜尋樹 《演算法導論》學習筆記十一
二叉搜尋樹是以一顆二叉樹來組織的,每個節點除資料外,還包括三個分別指向父結點 左孩子 右孩子的指標,二叉搜尋樹有個特性 某個結點root的左子樹的某個節點x的關鍵值小於等於root結點右子樹某個結點y的關鍵值。二叉搜尋樹有幾個操作 1 查詢 查詢與給定關鍵值相等的結點 2 遍歷 前序 中序 後序遍歷...
演算法導論 二叉搜尋樹
搜尋樹資料結構支援許多動態集合操作,包括search minimum maximum predecessor successor insert和delete等。因此,我們使用一棵搜尋樹既可以作為乙個字典又可以作為乙個優先佇列。二叉搜尋樹上的基本操作所花費的時間與這棵樹的高度成正比。對於乙個有n個結點...