資料結構與演算法 二叉樹

2021-09-23 18:25:36 字數 4081 閱讀 1651

2.1 二叉樹特性

與普通樹根本區別:

(1)每個元素恰好有兩棵子樹

(2)每個元素的子樹是有序的,左子樹和右子樹

(3)二叉樹可以為空

例:表示式樹

特性:

(1)有n各元素,必有n-1條邊

(2)有n個元素,高度最小log

2(n+

1)log_2(n+1)

log2​(

n+1)

,最大n

(3)高度為h,最少h個元素,最多2h−

12^h-1

2h−1

個元素(4)完全二叉樹某元素編號為i,1≤i

≤n1\le i \le n

1≤i≤

n,有以下關係成立:

#ifndef binarytreenode_

#define binarytreenode_

using namespace std;

template

struct binarytreenode

binarytreenode

(const t& theelement)

:element

(theelement)

binarytreenode

(const t& theelement,

binarytreenode* theleftchild,

binarytreenode* therightchild)

:element

(theelement)};

#endif

2.3 二叉樹常用操作

以上操作可通過對二叉樹的遍歷實現。

2.4 二叉樹遍歷

常用的4中遍歷方法:

template 

void

preorder

(binarytreenode

*t)}

template 

void

inorder

(binarytreenode

*t)}

template 

void

postorder

(binarytreenode

*t)}

前三種方法相同之處:左子樹先於右子樹遍歷

區別在於:對每個節點訪問時間不同

***例:***對下圖三個數分別用上述三種遍歷方法進行遍歷

結果如下:

其中,遍歷方法visit(t)程式如下:

template 

void

visit

(binarytreenode

*x)

template 

void

levelorder

(binarytreenode

*t) catch (queueempty)

q.pop();

}}

3.1 抽象資料型別

3.2 類linkedbinarytree

宣告如下:

template

class linkedbinarytree : public binarytree

>

~linkedbinarytree()

; bool empty()

const

intsize()

const

e*rootelement()

const

;void

maketree

(const e& element,

linkedbinarytree

&, linkedbinarytree&)

; linkedbinarytree

&removeleftsubtree()

; linkedbinarytree

&removerightsubtree()

;void

preorder

(void

(*thevisit)

(binarytreenode*)

)void

inorder

(void

(*thevisit)

(binarytreenode*)

)void

postorder

(void

(*thevisit)

(binarytreenode*)

)void

levelorder

(void(*

)(binarytreenode*)

);void

preorderoutput()

void

inorderoutput()

void

postorderoutput()

void

levelorderoutput()

void

erase()

intheight()

const

protected:

binarytreenode

* root;

// pointer to root

int treesize;

// number of nodes in tree

static

void

(*visit)

(binarytreenode*)

;// visit function

static

int count;

// used to count nodes in a subtree

static

void

preorder

(binarytreenode

* t)

;static

void

inorder

(binarytreenode

* t)

;static

void

postorder

(binarytreenode

* t)

;static

void

countnodes

(binarytreenode

* t)

static

void

dispose

(binarytreenode

* t)

static

void

output

(binarytreenode

* t)

static

void

addtocount

(binarytreenode

* t)

static

intheight

(binarytreenode

* t);}

;

方法定義略。

設定訊號放大器

並查集

演算法與資料結構 二叉樹

二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...

資料結構與演算法 二叉樹

1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...

資料結構與演算法 二叉樹

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 性質1 在二叉樹的第i層上至多有2 i 1 個結點 i 0 性質2 深度為k的二叉樹至多有2 k 1個結點 k 0 性質3 對於任意一棵二叉樹,如果其葉結點數為n0,而度...