資料結構1 從二叉樹到二叉堆

2021-08-25 09:04:47 字數 1707 閱讀 3801

資料結構是計算機儲存、組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。

不過,作為一些剛剛接觸資料結構的人來說,我們並不需要了解這麼多——恰恰相反,我們從簡單的開始。

這裡,我先講的的基本的樹。

最基本的樹,是比較簡單的。它長的就像生活中的樹一樣——有樹根,有枝條(分支),有葉子……。不過,在計算機中,我們一般把它倒過來:

我圖畫的醜,別怪我。

然後一些基本的名詞,例如根節點,葉子結點,父節點及子節點等,有大概能理解了吧。

上面的樹叫二叉樹,每個非葉子節點的結點都最多只有兩個孩子 。

樹一般這麼定義:

struct tree

;

left指向左兒子,right指向右兒子,num表示該節點的值(?)。當然,也可以直接用陣列模擬。

插入乙個結點就是找到他的父親,讓父親的左兒子或者右兒子指向他。刪除比較複雜,暫時不討論。

struct tree father;

struct tree son;

struct tree *p=&father;

father.left=&son;

*p->left;

接下來,我們設想一下,如果我們給這個樹上的每乙個結點賦予乙個值(存在上面的num裡!)……然後,我們在經過調整後,使得這個二叉樹有序,那麼會怎麼樣呢?

還是上面的那張圖,假設編號為1的結點的值就是1,編號為2的結點值就是2……那麼上面的樹是不是滿足乙個性質:每個父節點的值都比它所有的孩子的值小

答案是肯定的(不信你自己看),那麼這個就是乙個二叉堆。再仔細點來說,這是乙個小根堆。(什麼大根小根的!)

小根堆指的是每個父節點的值都比它所有的孩子的值小;相反,大根堆指的是每個父節點的值都比它所有的孩子的值大。

我們來做乙個模擬,看一看如何插入新節點。

所以,根據這個原理,我們就能「維護」堆,使它始終滿足堆的性質。然後,我們用陣列模擬法,實現小根堆。cpp**:

#includeconst int max=1001;

int a[max];

void swap(int *a,int *b)

void down(int i,int m)

}int main()

for(int i=1;i<=n;i++)

printf("%d ",a[i]);

return 0;

}

然後,我們看到,輸出是有序的——無論你輸入是否有序。這就是傳說中的堆排序。

堆在stl裡也有模板(其實是優先佇列,不過大多數時候可以用)。下面是常見的。

#includeusing namespace std;

priority_queuea;

int main()

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...

資料結構 二叉樹 1

二叉樹 構建 二叉樹的構建採用的是先序遍歷,先儲存根節點然後左右節點,用遞迴的思想將所有資料放在樹中。實現 實現了4種訪問方法,先序,中序,後序,和層序的訪問方法都採用遞迴的方式。include include includeusing namespace std templatestruct ro...

資料結構 樹結構 二叉樹 完全二叉樹 滿二叉樹

樹結構是一種描述非線性層次關係的資料結構。除根結點外,其餘每個結點有且僅有乙個直接前驅。每個結點可以有任意多個直接後繼。英文名詞表示 tree,root,node,leaf,edge,child,subtree 要麼二叉樹沒有根結點,是一棵空樹。要麼二叉樹由根結點,左子樹,右子樹組成,且左子樹和右子...