c 實現堆排序 及二叉樹操作

2021-09-27 08:30:49 字數 3626 閱讀 4497

#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...