以下是我學習二叉堆的總結:
#include
#include
/** * 時間複雜度 o(log(n))
* 空間複雜度 o(1)
* int tree 和 int size 合起來表示裝堆的值的陣列
* int rootidx 表示要調整的結點的下標
*/// 向下調整的**
void
adjustdown
(int tree,
int size,
int rootidx)
// 不是葉子
int minidx = leftidx;
if(rightidx < size && tree[rightidx]
< tree[leftidx]
)// 最小孩子的下標就是 minidx
if(tree[rootidx]
<= tree[minidx]
)int t = tree[minidx]
; tree[minidx]
= tree[rootidx]
; tree[rootidx]
= t;
// 如果發生了交換,則下面的樹的堆性質可能被破壞了,繼續調整
adjustdown
(tree, size, minidx);}
void
adjustdown2
(int tree,
int size,
int rootidx)
// 如果不是葉子,找到最小孩子的下標
int minidx;if(
2* rootidx +
2>= size)
else
if(tree[
2* rootidx +1]
<= tree[
2* rootidx +2]
)else
// 拿最小孩子的值 和 要調整的根的值進行比較
if(tree[rootidx]
<= tree[minidx]
)else
}// 粗略看,時間複雜度是 o(n * log(n))
// 精確算,是 o(n)
// 找到最後乙個非葉子結點,開始整體向下調整
void
createheap
(int tree,
int size)
}#include
void
test()
;int size =
sizeof
(array)
/sizeof
(int);
createheap
(array, size)
;printf
("hello world\n");
}typedef
struct heap heap;
#include
#include
// 初始化二叉樹的順序表
void
heapinit
(heap *ph,
int array,
int size)
// 向上調整的**
void
adjustup
(int tree,
int size,
int child)
int parent =
(child -1)
/2;if
(tree[child]
>= tree[parent]
)int t = tree[child]
; tree[child]
= tree[parent]
; tree[parent]
= t;
adjustup
(tree, size, parent);}
// log(n)
// 尾插,之後向上調整
void
(heap *ph,
int v)
// o(log(n)) 每次出的是當前最小值
// 頭刪,之後向下調整
int(heap *ph)
void
test2()
;int size =
sizeof
(array)
/sizeof
(int);
heap heap;
heapinit
(&heap, array, size)
;for
(int i =
0; i <
3; i++
)printf
("after pop\n");
for(
int i =
0; i <
3; i++
)printf
("after push\n");
int size2 = heap.size;
for(
int i =
0; i < size2; i++)}
// 排降序,建小堆
// 建大堆,找出最大值後,會破壞堆結構
void
heapsort
(int array,
int size)
}// 測試
void
test3()
;int size =
sizeof
(array)
/sizeof
(int);
heapsort
(array, size)
;printf
("hello\n");
}
資料結構 八 二叉排序樹
基本操作 建立bst 查詢 插入乙個節點 中序遍歷 將得到遞增序列 刪除乙個節點 include include include pragma warning disable 4996 typedef struct mybst bst bst create 建立bst bst insert bst ...
資料結構 八 二叉樹
二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹遍歷,就是按一定的規則和順序走遍二叉樹的所有結點,使每乙個結點都被訪問一次,而且只被訪問一次。設l d r分別表示遍歷左子樹 訪問根結點和遍歷右子樹,則對一棵二叉樹...
資料結構(八)二叉樹遍歷
二叉樹是一種樹形結構,遍歷就是要讓樹中的所有節點被且僅被訪問一次,即按一定規律排列成乙個線性佇列。二叉 子 樹是一種遞迴定義的結構,包含三個部分 根結點 n 左子樹 l 右子樹 r 根據這三個部分的訪問次序對二叉樹的遍歷進行分類,總共有6種遍歷方案 nlr lnr lrn nrl rnl和lnr。研...