二叉堆和二叉搜尋樹高階

2022-06-26 03:45:13 字數 1078 閱讀 3150

1、引言

《演算法競賽高階指南》中指出,在二叉樹中,有兩組非常重要的條件,分別是兩類資料結構的基本性質。

其一是「堆性質」,若二叉樹中的任意乙個節點的權值都大於等於(小於等於)其父親節點,則稱該二叉樹滿足「小頂堆性質(大頂堆性質)」。

其二是「bst性質」,二叉樹上的每個節點都帶有乙個數值,稱為該節點的鍵值 $key$,樹中的任意乙個節點的 $key$ 均同時滿足:大於等於其左子樹中任意節點的 $key$,小於等於其右子樹中任意節點的 $key$。

在日常的刷題過程中,經常會用到優先佇列、set、map等stl的容器,但是實際上它們的底層實現某種程度上可以說是二叉堆或者bst,而且二叉堆和bst作為較基礎的資料結構,我們應當學會如何實現。

2、二叉堆的實現

struct

heap

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 解釋 輸入為 ...