二叉查詢樹 \((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...