演算法導論第12章 二叉搜尋樹

2021-08-31 11:42:40 字數 2302 閱讀 9112

左子樹 < 根 < 右子樹

根據二叉樹的基本性質,向左子樹或右子樹遞迴即可

查詢結點x的後繼y分為兩種情況:

①右結點存在,即只需要找到右子樹中最小的元素就好了

②右結點不存在,此時就要向親代查詢,直到找到右上方的親代,此時y是x的最底層祖先,且y的左孩子是x的乙個祖先。

迭代演算法:類似於一根小棒在樹中移動,最終把待插入元素放置在乙個空結點上

假設要刪除結點z,那麼需要分3種情況討論:

①若沒有孩子,直接刪除即可,以空結點null代替之。

②若只有乙個孩子,以孩子代替結點z

③若有兩個孩子

a)若右孩子為其後繼:將右子樹代替結點z即可

b)若右孩子不是其後繼:設z的後繼為y,y的右孩子為x,則將y原來的位置以x代替,y將z代替

不斷地插入節點,最後中序遍歷即可——元素之間的比較和快速排序相同,故它們的執行效率相似。若採用隨機化策略,則平均執行時間為θ(n*logn),樹高為θ(logn)

#include using namespace std;

#pragma once

//設想是:當樹為空時,root一定為nullptr

struct node

;class binarysearchtree

~binarysearchtree();

int size();

int maximum();

int minimum();

void print();

void clear();

void insert(const int&);

void remove(const int&);

private:

int cnt = 0;

node* root = nullptr;

node* minimum(node* x);

void transplant(node* u, node* v);

void clear(node*);

void print(node*);

};void binarysearchtree::clear(node* x)

void binarysearchtree::clear()

binarysearchtree::~binarysearchtree()

int binarysearchtree::maximum()

node* binarysearchtree::minimum(node* x)

int binarysearchtree::minimum()

int binarysearchtree::size()

void binarysearchtree::print(node* x)

void binarysearchtree::print()

void binarysearchtree::insert(const int& a)

else

node* t = new node;

t->parent = y;

t->element = a;

if(a > y->element) y->right = t;

else y->left = t;

}++cnt;

}void binarysearchtree::transplant(node* u, node* v)

void binarysearchtree::remove(const int& a)

if(x == nullptr) return;

--cnt;

if(x->left == nullptr)

transplant(x, x->right);

else if(x->right == nullptr)

transplant(x, x->left);

else

transplant(x, y);

y->left = x->left;

y->left->parent = y;}}

演算法導論 12章 二叉搜尋樹

最壞執行時間 完全二叉樹 o lgn 線性鏈 o n 隨機構造 o lgn 平均時間o lgn 二叉搜尋樹性質 左子樹小於雙親,右子樹大於雙親 二叉搜尋樹的基本操作所花費的時間與這棵樹的高度成正比。遍歷中序遍歷o n 子樹根在左右之間 偽 inorder tree walk x if x nil i...

演算法導論 第12章 二叉查詢樹

二叉查詢樹是一種樹資料結構,它與普通的二叉樹最大的不同就是二叉查詢樹滿足乙個性質 對於樹中的任意乙個節點,均有其左子樹中的所有節點的關鍵字值都不大於該節點的關鍵字值,其右子樹中的任意乙個節點的關鍵字值都不小於該節點的關鍵字值。在二叉查詢樹上可以進行搜尋 取最小值 取最大值 取指定節點的前驅 取指定節...

第12 章 二叉搜尋樹

搜尋樹結構支援許多動態集合操作,因此,使用一棵搜尋樹既可以作為乙個字典又可以作為乙個優先佇列。二叉搜尋樹的基本操作所花費的時間與這棵樹的高度成正比。對於 n 個節點的乙個完全二叉樹來說,這些操作的最壞執行時間為 lgn 然而,如果這棵樹是一條 n 個節點組成的線性鏈,那麼同樣的操作就要花費 n 的最...