1、引言
《演算法競賽高階指南》中指出,在二叉樹中,有兩組非常重要的條件,分別是兩類資料結構的基本性質。
其一是「堆性質」,若二叉樹中的任意乙個節點的權值都大於等於(小於等於)其父親節點,則稱該二叉樹滿足「小頂堆性質(大頂堆性質)」。
其二是「bst性質」,二叉樹上的每個節點都帶有乙個數值,稱為該節點的鍵值 $key$,樹中的任意乙個節點的 $key$ 均同時滿足:大於等於其左子樹中任意節點的 $key$,小於等於其右子樹中任意節點的 $key$。
在日常的刷題過程中,經常會用到優先佇列、set、map等stl的容器,但是實際上它們的底層實現某種程度上可以說是二叉堆或者bst,而且二叉堆和bst作為較基礎的資料結構,我們應當學會如何實現。
2、二叉堆的實現
structheap
else
break
; }
}void push(int x) //
插入權值為x的節點
inline
int top()
void down(int
now)
else
break
; }
}void pop() //
移除堆頂
void del(int p) //
刪除儲存在陣列下標為p位置的節點
inline
void clr()
};
3、二叉堆的應用
3.1、poj 1456
3.2、二叉堆優化dijkstra
3.3、bzoj 1150
4、二叉搜尋樹
普通的二叉搜尋樹每次期望複雜度為 $o(\log n)$,但是非常容易退化為 $o(n)$,因此實際應用中一般使用平衡二叉查詢樹。
4.1、伸展樹splay
伸展樹原理:
伸展樹(splay tree)高階 - 從原理到實現
伸展樹實現:
poj 3580 - supermemo - [伸展樹splay]
4.2、treap
bzoj 3224 - 普通平衡樹 - [treap]
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 ...
樹 二叉樹 二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...