查詢樹是一種資料結構,它支援多種動態集合操作。包含search、minimum、maximum、predecessor、successor、insert、delete等。它既能夠用作字典,也能夠用作優先順序佇列;在二叉查詢樹(binary search tree)上執行基本操作的時間與樹的高度成正比,對於一顆含有n個結點的全然二叉樹,基本操作的最壞情況執行時間為fl
oor(
logn
)。本章討論二叉查詢樹的基本性質以及上面提及的基本操作的實現。
github 程式實現**
例如以下圖所看到的。一顆二叉查詢樹是依照二叉樹結構來組織的。這種樹一般用鍊錶結構表示,每個結點是乙個物件,包含關鍵字key、父親結點parent、左兒子結點left以及右兒子結點right四個屬性。
明顯的,對於二叉查詢樹中關鍵字的儲存方式總是滿足這種性質: 設x
為二叉查詢樹中的乙個結點。假設y是
x左子樹中的乙個結點,則y−
>ke
y<=x−
>ke
y,假設y是
x右子樹中的乙個結點,則y−
>ke
y>=x−
>ke
y。依據二叉查詢樹的性質。能夠用乙個遞迴演算法依照排列順序依次輸出全部關鍵字,這就是中序遍歷,遍歷順序為根、左子樹、右子樹。相同的,有前序遍歷,根的關鍵字在左右子樹之前輸出。後序遍歷。根的關鍵字在其左右子樹之後輸出。
對於二叉查詢樹,最常見的操作就是查詢樹中的某個關鍵字。
查詢操作相同採用遞迴的形式實現,其複雜度等於樹的高度。
操作步驟例如以下圖所看到的:
對於用作優先順序佇列的結構。求最大最小關鍵字是不可缺少的操作。
要查詢二叉查詢樹中的最小關鍵字,依據樹的性質,僅僅要從根節點開始,沿著各個結點的left指標查詢下去,直到遇到null為止。
同理,要查詢二叉查詢樹中的最大關鍵字,依據樹的性質。僅僅要從根節點開始,沿著各個結點的right指標查詢下去,直到遇到null為止。
這兩個操作的執行時間都是o(
h)。我們知道。中序遍歷二叉查詢樹得到的是一組有序序列,有時候須要求指定結點的前驅與後繼。對於給定結點
x的後繼結點是具有大於或等於x−
>ke
y中關鍵字的最小結點;同理,對於給定結點
x的前驅結點是具有小於x−
>ke
y中關鍵字的最大結點。依據二叉查詢樹的性質,不用對關鍵字做不論什麼比較就能夠得到給定結點的前驅和後繼結點。
插入和刪除操作會引起整個二叉查詢樹表示的集合的動態變化。要反應出這種變化。就要改動資料結構,可是在改動的同一時候。還要保持整棵樹的性質不變。
將新值插入到一顆二叉查詢樹中的步驟例如以下:
相對於插入操作。刪除更加複雜一些。下圖具體展示了刪除不同結點須要的步驟:
對高度為
h的二叉查詢樹,動態集合操作insert與delete的執行時間都是o(
n)。以下給出的程式實現。包含了全部以上提及的基本操作: (1
)bin
arys
earc
htree.h
#ifndef _binarysearchtree_h_
#define _binarysearchtree_h_
#include
typedef struct bstnode
};class
binarysearchtree;
//查詢操作
bstnode *search
(bstnode * node, int
data);
//遍歷操作
void inorderwalk
(bstnode * node);
void preorderwalk
(bstnode * node);
void postorderwalk
(bstnode * node);
//查詢最大最小值
bstnode *maximum
(bstnode * node);
bstnode *minimum
(bstnode * node);
//查詢前驅與後繼
bstnode *predecessor
(bstnode *node);
bstnode *successor
(bstnode *node);
#endif
(2
)bin
arys
earc
htre
e.cp
p
#include "binarysearchtree.h"
#include
binarysearchtree::binarysearchtree()
binarysearchtree::~binarysearchtree()
//向二分查詢樹中插入資料data
void
binarysearchtree::insert(int data)
node->parent = q;
if (q == null)
root = node;
else
if (q->key > data)
q->left = node;
else
q->right = node;
}//從二分查詢樹中刪除資料
bstnode *binarysearchtree::delete(int data)
//查詢以node結點為根的子樹中值為data的結點
bstnode *search(bstnode * node, int data)
//遍歷操作
void
inorderwalk(bstnode * node)
}void
preorderwalk(bstnode * node)
}void
postorderwalk(bstnode * node)
//查詢最大最小值
bstnode *maximum(bstnode * node)
bstnode *minimum(bstnode * node)
//查詢前驅與後繼
bstnode *predecessor(bstnode *node)
return p;
}bstnode *successor(bstnode *node)
return p;
}
(3
)mai
n.cp
p
#include "binarysearchtree.h"
#include
#include
#include
using
namespace
std;
const
int max = 101;
const
int n = 10;
int main()
else
system("pause");
return
0;}
測試結果(查詢失敗的情況):
測試結果(查詢成功並刪除):
在本章的最後介紹了一種隨機構造二叉查詢樹的理論方法,這主要是針對普通二叉查詢樹基本操作執行時間o(
h)考慮的。這種方式能夠使得:
一棵在n個關鍵字上隨機構造的二叉查詢樹的期望高度為o(
logn
)。 這一部分感覺應用不多吧,木有細緻看,^||^~~
演算法導論筆記 12二叉搜尋樹
1 概念 二叉搜尋樹也叫二叉排序樹,它支援的操作有 search,minimum,maximum,predecessor,successor,insert,delete。所以,一顆二叉搜尋樹既可以作為乙個字典,又可以作為乙個優先佇列。二叉搜尋樹的基本操作時間與這棵樹的高度成正比。二叉搜尋樹的高度可以...
演算法導論 12章 二叉搜尋樹
最壞執行時間 完全二叉樹 o lgn 線性鏈 o n 隨機構造 o lgn 平均時間o lgn 二叉搜尋樹性質 左子樹小於雙親,右子樹大於雙親 二叉搜尋樹的基本操作所花費的時間與這棵樹的高度成正比。遍歷中序遍歷o n 子樹根在左右之間 偽 inorder tree walk x if x nil i...
演算法導論筆記 12二叉搜尋樹
1 概念 二叉搜尋樹也叫二叉排序樹,它支援的操作有 search,minimum,maximum,predecessor,successor,insert,delete。所以,一顆二叉搜尋樹既可以作為乙個字典,又可以作為乙個優先佇列。二叉搜尋樹的基本操作時間與這棵樹的高度成正比。二叉搜尋樹的高度可以...