#include
using
namespace std;
#if 0
void
heapadjust
(int
* array,
int size,
int parent)
if(array[parent]
< array[child]
)else
return;}
}// 堆排序
void
heapsort
(int
* array,
int size)
}int
main()
;heapsort
(array,
sizeof
(array)
/sizeof
(array[0]
));return0;
}#endif
#if 0
template
<
classt,
class
compare
>
void
heapadjust
(t* array,
int size,
int parent, compare com)if(
com(array[child]
, array[parent]))
else
return;}
}// 堆排序
template
<
classt,
class
compare
>
void
heapsort
(t* array,
int size, compare com)
}#include
intmain()
;heapsort
(array,
sizeof
(array)
/sizeof
(array[0]
), less<
int>()
);//sort(array, array + sizeof(array) / sizeof(array[0]), greater())
return0;
}#endif
#include
// 孩子表示法
struct btnode
btnode* _pleft;
btnode* _pright;
int _data;};
// a b d c e f
btnode*
createbintree
(const vector<
int>
& v,
int& index,
const
int invalid)
return proot;
}void
destroy
(btnode*
& proot)
}// 遍歷:對二叉樹中的每個節點進行某種操作,並且每個節點只操作一次
// 前序、中序、後序
// 操作:將節點中的值域列印
void
preorder
(btnode* proot)
}#include
void
preordernor
(btnode* proot)
}void
inorder
(btnode* proot)
}void
inordernor
(btnode* proot)
pcur = s.
top();
cout << pcur-
>_data <<
" ";
s.pop();
pcur = pcur-
>_pright;}}
void
postorder
(btnode* proot)
}void
postordernor
(btnode* proot)
btnode* ptop = s.
top();
// ptop右子樹不存在
// ptop右子樹已經遍歷if(
nullptr
== ptop-
>_pright ||
ptop-
>_pright == pprev)
else}}
#include
void
levelorder
(btnode* proot)
}size_t height
(btnode* proot)
size_t getbtreenode
(btnode* proot)
size_t getleafnode
(btnode* proot)
return
getleafnode
(proot-
>_pleft)
+getleafnode
(proot-
>_pright);}
size_t getklevelnodecount
(btnode* proot, size_t k)
btnode*
getparent
(btnode* proot, btnode* pnode)
// 前序 中序
btnode*
_rebuildtree
(const vector<
int>
& pre,
int& index,
const vector<
int>
& in,
int left,
int right)
btnode*
rebuildtree
(const vector<
int>
& pre,
const vector<
int>
& in)
intmain()
;int index =0;
btnode* proot =
createbintree
(v, index,-1
);preorder
(proot)
;preordernor
(proot)
; cout << endl;
inorder
(proot)
;inordernor
(proot)
; cout << endl;
postorder
(proot)
;postordernor
(proot)
;destroy
(proot)
; vector<
int> pre
; vector<
int> in
; btnode* pnewroot =
rebuildtree
(pre, in)
;return0;
}
二叉樹之堆排序
堆排序,首先要對堆的性質有了解,分大頂堆和小頂堆,我這次寫的是大頂堆,即父節點大於其子節點,在把堆無序後,從堆頂開始遍歷,得到大堆頂,把堆頂與最後乙個元素對換,這時,最後乙個元素就是最大值,這時,就不用考慮最後乙個元素了,開始迴圈。重新開始從頭遍歷,詳細過程寫在 裡,大家參考 此排序主要有2個難點,...
二叉樹與堆排序
樹與二叉樹簡介 樹是一種資料結構,比如目錄結構,樹是一種可以遞迴定義的資料結構 樹是由n個節點組成的集合,如果n 0,那麼這是一顆空樹,如果n 0,那存在乙個節點作為樹的根節點,其他節點可以分為m個子樹,每個子樹本身又是一棵樹 一些概念 根節點 葉子節點 a就是根節點,沒有子樹的都是葉子節點,如圖中...
堆排序(完全二叉樹)
堆排序,一種全新的排序方式,運用了完全二叉樹存資料。假設根是u,那麼左兒子就是u 2,右兒子是u 2 1.用一維陣列手擼乙個堆排序。1,如何插入乙個數。heap size x up size 2,求集合中的最小值。heap 1 3,刪除最小值。heap 1 heap size size down 1...