《演算法導論》學習筆記(3) 二叉搜尋樹

2021-06-26 17:21:21 字數 1834 閱讀 9296

二叉搜尋樹是以一棵二叉樹來組織的。在二叉樹的基礎上,增加了一些限制:

對於任何結點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個結點...