原创 二叉樹應用_序列化二叉樹

題目:實現兩個函數,實現序列化和反序列化二叉樹。 分析:我們可以從前序遍歷和中序遍歷序列構造出一個二叉樹。我們可以先把一顆二叉樹序列化成一個前序遍歷序列和一箇中序遍歷序列,然後進行構造。但是這個思路有兩個缺點,一個是要求兩個序列

原创 數據結構_樹的定義及存儲結構

樹 樹的特點:不是簡單的線性結構,但在確定某種次序之後,具有線性特徵。對於樹,它集成vector和list的優點,既可以快速插入、刪除也可以快速查找。 遞歸定義 樹是特殊的圖T=(V,E),節點數|V|=n ,邊數|E|=e。

原创 鏈表問題_在O(1)時間內刪除鏈表節點

題目:給定單向鏈表的頭指針和一個節點指針,定義一個函數在O(1)時間內刪除該結點。 分析:對於刪除單向鏈表中的節點,通常的思路:刪除節點I之前,先從鏈表的頭結點開始遍歷到I前面的一個節點h,把h的next節點指向I的下一個節點j

原创 數據結構_二叉樹的遍歷

二叉樹的遍歷 樹的遍歷即是:按照某種次序訪問樹中各個節點,並且每個節點恰好被訪問一次。 遍歷的方式有以下幾種: 先序:V | L | R 中序:L | V | R 後序:L | R | V 層次/廣度優先:自上而下,

原创 數據結構_平衡二叉搜索樹(伸展樹 splay tree)

splay tree 與之前介紹的AVL樹一樣,伸展樹也是平衡二叉搜索樹的一種形式。首先,鑑於數據訪問的局部性在實際應用中普遍存在,將按照“最常用者優先”的啓發策略,引入並且實現伸展樹。儘管最壞的情況下單次操作需要O(n)時間,但

原创 二叉樹應用_二叉搜索樹的第K個節點

題目:給定一顆二叉搜索樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值爲4。 分析:進行中序遍歷,中序遍歷序列的數值是遞增排序的。 /* stru

原创 鏈表問題_從尾到頭打印鏈表

題目:輸入一個鏈表的頭節點,從尾到頭打印鏈表。 分析:有兩種思路,1、藉助棧,從頭到尾遍歷鏈表將值存入棧中,然後輸出棧中的值即可。2、可以使用遞歸,遞歸的本質就是一個棧結構,但是當鏈表很長的時候,會導致函數調用的層級很深,從而導

原创 數據結構_平衡二叉搜索樹(AVL樹)

平衡二叉搜索樹 在二叉搜索樹中,已經知道search、insert和remove等主要接口的運行時間均正比於樹的高度。但是在最壞的情況下,二叉搜索樹可能退化成列表,此時查找的效率會降至O(n)。因此,通常通過控制樹高,來控制最壞情

原创 鏈表問題_鏈表中倒數第K個節點

題目:輸入一個鏈表,輸出該鏈表中倒數第k個節點。尾節點爲倒數第一個節點。 分析:可以採用兩個指針,記爲start和end,先讓end在鏈表上走k-1步,然後兩個節點同時開始走,當end到達尾節點時,start即爲倒數第k個節點。

原创 數據結構_二叉搜索樹

二叉搜索樹 所謂的查找,指從一組數據對象中找出符合特定條件者。其中的數據對象,統一的表示和實現爲詞條(entry)的形式;不同的數據項之間,依照各自的關鍵碼(key)彼此區分。 一般而言詞條應以如下形式: template

原创 數據結構_kd-樹

kd-樹 一維範圍查詢 如下圖所示,許多實際應用問題,都可歸結爲如下形式的查詢:給定直線L上的點集P={P0,….,Pn-1},對於任一區間R=[x1,x2],P中哪些點落在其中。 上述這種查找問題統稱爲一維範圍查詢,對於

原创 數據結構_B-樹

B-樹 從嚴格意義上講B-數並不是二分查找樹,在物理上B-樹的每個節點可以包含多個分支,但是從邏輯上講,它等同於二分查找樹。爲了瞭解B-樹,首先要了解以下幾個方面的內容。 1、越來越小的內存 事實上:內存容量的增長速度時要遠遠小於

原创 鏈表問題_反轉鏈表

題目:輸入一個鏈表的頭結點,翻轉該鏈表之後輸出頭結點。 分析:翻轉一個鏈表即翻轉其連接方向,定義三個指針,pnode表示當前遍歷到的節點;p_pre爲pnode的前驅,p_succ爲pnode的後繼,之前的連接方向爲p_pre-

原创 make_heap 用法

對make_heap(), pop_heap(), push_heap()的用法做個總結: make_heap()生成堆,他有兩個參數,也可以有三個參數,前兩個參數是指向開始元素的迭代器和指向結束元素的下一個元素的迭代器。第三個參數

原创 啊哈算法(7)——神奇的樹

1、堆(完全二叉堆) 建堆的方法:(自上而下的向上調整)每一次插入一個新節點,並且對其進行向上調整,實現如下: /*建立最小堆,方法一*/ #include<iostream> using namespace std; int