BST學習筆記

2022-05-08 15:54:11 字數 3159 閱讀 5674

序言本文的作者是在不知道stl直接提供了可用的bst下學習的bst,所以嫌麻煩的話可以直接使用stl(逃)

概念二叉搜尋樹bst(binary search tree)是一顆二叉樹,它的每個內部節點都關聯乙個關鍵字,並具有以下性質 :任意節點的關鍵字大於(或等於)該節點左子樹中所有節點的關鍵字,小於(或等於)該節點右子樹中所有節點的關鍵字。簡單的來說,就是乙個點的權值小於等於右兒子子樹所有點的權值,大於等於左兒子子樹所有點的權值。如下圖:

用途插入x數

刪除x數(若有多個相同的數,因只刪除乙個)

查詢x數的排名(排名定義為比當前數小的數的個數+1。若有多個相同的數,因輸出最小的排名)

查詢排名為x的數

求x的前驅(前驅定義為小於x,且最大的數)

求x的後繼(後繼定義為大於x,且最小的數)

實現定義:

struct

bst

}t[n];

一些用到的小函式:

inline int judge(int x)//

判斷x是其父親的哪乙個兒子

inline

void update(int x)//

x為根的樹有多少值

inline

void merge(int x,int y,int opt)//

x成為y的兒子

插入操作:

inline void insert(int v,int f,int

n) t[n].siz++;

if(t[n].val==v)

if(t[n].val>v) insert(v,n,t[n].son[0

]);

else insert(v,n,t[n].son[1

]);}

查詢編號:

inline int find(int v,int n)//

查詢某個值對應的節點編號

查詢乙個值的前驅後繼:

inline int find_pre(int v,int n,int ans)//

查詢前驅

inline

int find_suf(int v,int n,int ans)//

查詢後繼

刪點(準確來說是刪掉乙個值):

inline void crash(int v)//

刪除乙個權值為v的點

if(!t[n].son[0]&&!t[n].son[1])

if(!t[n].son[0]||!t[n].son[1

])

int pos=find_pre(t[n].val,n,0

); swap(t[n].val,t[pos].val);

t[t[pos].fa].son[judge(pos)]=0

; }

用值找排名和用排名找值:

inline int v_rank(int v,int n,int ans)//

用值找排名

inline

int rank_v(int rank,int n)//

用排名找值

最後貼一下完整**,(按照洛谷p3369題意,如果不怕t可以提交

#includeconst

int n=1e6+5

;using

namespace

std;

intcnt,rt;

struct

bst

}t[n];

inline

int judge(int x)//

判斷x是其父親的哪乙個兒子

inline

void update(int x)//

x為根的樹有多少值

inline

void merge(int x,int y,int opt)//

x成為y的兒子

inline

void insert(int v,int f,int

n) t[n].siz++;

if(t[n].val==v)

if(t[n].val>v) insert(v,n,t[n].son[0

]);

else insert(v,n,t[n].son[1

]);}

inline

int find(int v,int n)//

查詢某個值對應的節點編號

inline

int find_pre(int v,int n,int ans)//

查詢前驅

inline

int find_suf(int v,int n,int ans)//

查詢後繼

inline

void crash(int v)//

刪除乙個權值為v的點

if(!t[n].son[0]&&!t[n].son[1])

if(!t[n].son[0]||!t[n].son[1

])

int pos=find_pre(t[n].val,n,0

); swap(t[n].val,t[pos].val);

t[t[pos].fa].son[judge(pos)]=0; }

inline

int v_rank(int v,int n,int ans)//

用值找排名

inline

int rank_v(int rank,int n)//

用排名找值

inline

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}int

main()

return0;

}

其他二叉搜尋樹在最壞情況下insert操作是n,search操作是n,select操作也是n,平均都是logn。(我在想二分搜尋在最壞情況下都比它跑的快),我們在這裡可以與其他方式進行時間複雜度對比:

以及毒瘤出題人的兩種毒瘤資料:

演算法複習筆記 BST

二叉樹是一種能夠將鍊錶插入的靈活性和有序陣列查詢的高效性結合起來的資料結構實現,這個資料結構主要是由一些節點構成。節點包含的鏈結可以為null或者指向其他節點,在二叉樹中,每個節點最多只能有乙個父節點,而且每個節點都有左右兩個子節點,如果把節點指向的位置看成另一顆二叉樹,則乙個根節點指向的就是它的左...

二叉搜尋樹(BST)學習筆記

二叉搜尋樹 binary search tree 簡稱 bst 用於在乙個集合中查詢元素。若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值 若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值 它的左右子樹也分別為二叉搜尋樹 1 插入 操作內容 將乙個元素插入二叉搜尋樹。操作方法 將...

二叉排序樹(BST)筆記

什麼是二叉排序樹 二叉排序樹中的每乙個節點,其值大於左子樹的所有節點的值,小於右子樹所有節點的值。7,3,10,12,5,1,9,2 陣列組成的bst 二叉排序樹的查詢效率很高,下面是一些關於二叉排序樹實現的方法。節點資訊 class node public void setval int val ...