筆記 二叉搜尋樹

2022-06-30 08:21:11 字數 1622 閱讀 4929

二叉查詢樹 \((binary search tree)\) ,\((\) 又:二叉搜尋樹,二叉排序樹, \(bst)\) 它或者是一棵空樹,或者是具有下列性質的二叉樹:

若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。

二叉搜尋樹上的基本操作的時間複雜度與這棵樹的深度成正比。對於乙個有 \(n\) 個結點的二叉搜尋樹中,這些操作的最優時間複雜度為 \(o(\log n)\) ,最壞為 \(o(n)\) 。隨機構造這樣一棵二叉搜尋樹的期望高度為 \(o(\log n)\) 。

二叉搜尋樹作為一種經典的資料結構,它既有鍊錶的快速插入與刪除操作的特點,又有陣列快速查詢的優勢。

所以應用十分廣泛,例如:

一般的二叉搜尋樹支援:

/**********************************************自定義函式*/

const int _ = 1e5 + 10;

struct bst

t[_];

int n, siz, root = 1;

int val;

名稱

含義bst

二叉樹(變數不解釋)

siz節點個數

root

根節點val

新的節點權值

插入分為四種情況:

void ins(int &now, int val)

if (!now)//該節點為空,新加節點

else

if (val <= t[now].val)//now 權值大於 val

ins(t[now].ls, val);

else

if (val > t[now].val)//now 權值小於 val

ins(t[now].rs, val);

}

int del_min(int &now)//刪除 now 節點右子樹的最小值

else

return del_min(t[now].ls);

}

刪除分為三種情況:

void del(int &now, int val)// now 有可能會被修改

if (t[now].val > val)

del(t[now].ls, val);

else

del(t[now].rs, val);

}

直接暴力遞推判斷即可。

bool check(int now, int val)

int find_max(int now)

int find_min(int now)

菜雞只會暴力

void tvs(int now) //遍歷二叉樹

鳴謝:oi-wiki 二叉樹簡介

luckyblock 筆記 (老哥我想你了。。。/kk)

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

演算法筆記 二叉樹,二叉搜尋樹筆記(python)

二叉樹筆記 1.基本概念 1 根節點 2 葉節點 2.樹 圖 鍊錶之間的關係 1 鍊錶是特殊化的樹,例如一棵樹只有左子節點,而沒有右子節點 或者一棵樹只有右子節點,而沒有左子節點。如下圖。3.二叉樹,python定義 class treenode def init self,val self.val...