二叉樹實現 公式化描述

2022-04-06 02:49:38 字數 3259 閱讀 9954

樹的定義:樹( t r e e) t 是乙個非空的有限元素的集合,其中乙個元素為根( r o o t),餘下的元素(如果有的話)組成 t 的子樹( s u b t r e e)。

樹中層次最高的元素為根,其下一集的元素是餘下元素所構成子樹的根。

樹的另一常用術語為級(level)。指定樹根的級為1。

元素的度(degree of an element)是指其孩子的個數。葉節點的度為0.樹的度是其元素度的最大值。

二叉樹的定義:二叉樹( binary tree) t 是有限個元素的集合(可以為空) 。當二叉樹非空時,

其中有乙個稱為根的元素,餘下的元素(如果有的話)被組成 2個二叉樹,分別稱為 t的左子樹

和右子樹。

二叉樹和樹的根本區別是:

• 二叉樹可以為空,但樹不能為空。

• 二叉樹中每個元素都恰好有兩棵子樹(其中乙個或兩個可能為空)。而樹中每個元素可有

若干子樹。

• 在二叉樹中每個元素的子樹都是有序的,也就是說,可以用左、右子樹來區別。而樹的

子樹間是無序的。

二叉樹的特性:

特性1 :包含n個元素的二叉樹邊數為n-1

特性2:若二叉樹的高度為h,h>=0,則該二叉樹最少有h個元素,最多有2h-1個元素。

特性3:包含n個元素的二叉樹的高度最大為n,最小為log2(n+1) (向上取整)

滿二叉樹(除葉節點外,每個節點都有左右2個子節點),完全二叉樹(除最後一層外,每層都滿)

完全二叉樹中元素與孩子編號的關係:

特性4:設完全二叉樹中一元素的序號為i,1<=i<=n.則有以下關係:

當i=1時,節點為樹的根。若i>1,則該元素父節點為i/2(向下取整)

當2*i>n時,該元素無左孩子。否則,其左孩子為2*i。

當2*i+1>n時,無右孩子。否則,右孩子為2*i+1。二叉樹的公式化描述:二叉樹的公式化描述利用了特性 4。二叉樹可以作為缺少了部分元素的完全二叉樹。圖 8 - 8給出二叉樹的兩個樣例。第一棵二叉樹有三個元素 ( a、 b和c ),第二棵二叉樹有五個元素 ( a、b、 c、 d和e )。沒有塗陰影的圈表示缺少的元素。所有的元素 (包括缺少的元素 )按前面介紹的

方法編號。在公式化描述方法中,按照二叉樹對元素的編號方法,將二叉樹的元素儲存在陣列中。圖8 - 8同時給出了二叉樹的公式化描述。缺少的元素由白圈和方格描述。當缺少很多元素時,這種描述方法非常浪費空間。實際上,乙個有 n 個元素的二叉樹可能最多需要 2n- 1 個空間來儲存。

當每個節點都是其他節點的右孩子時,儲存空間達到最大。圖 8 - 9給出這種情況下一棵有四個

元素的二叉樹,這種型別的二叉樹稱為右斜 ( r i g h t - s k e w e d )二叉樹。當缺少的元素數目比較少時,

這種描述方法很有效。

遍歷方式:

前序遍歷:先左子樹,後根節點,後右子樹

中序遍歷:先根後左最後右

後序遍歷:先左後右最後根

層級遍歷:按層級遍歷 

c++**實現:

類定義:

1

#ifndef binarytreearray_h

2#define binarytreearray_h

3 #include 4

5 template

6class

arraytree710

void preorder(int

i);//前序

11void inorder(int

i);//中序

12void postorder(int

i);//後序

13void

levelorder();//層級

14int getleftchildpos(int i)

15int getrightchildpos(int i)

16private

:17 t*data;

18int

last;

19};

2021 template

22void arraytree::preorder(int

i)23

29if(i<=last)

3035

if (getleftchildpos(i) != -1)36

preorder(getleftchildpos(i));

37if (getrightchildpos(i) != -1)38

preorder(getrightchildpos(i));39}

40}4142 template

43void arraytree::inorder(int

i)44

50if(i<=last)

5162}63

}6465 template

66void arraytree::postorder(int

i)67

72if(i<=last)

7383}84

}8586 template

87void arraytree::levelorder()

8899

}100 std::cout<<:endl>

101 level++;

102}

103}

104#endif

//!binarytreearray_h

測試**:

1 #include "

binarytreearray.h"2

3int

main()

4;//0表示虛節點

67 arraytree tree(a, 11

);8 tree.preorder(1

);9 std::cout <<:endl>

10 tree.inorder(1

);11 std::cout <<:endl>

12 tree.postorder(1

);13

14 std::cout <<:endl>

15tree.levelorder();

16 system("

pause");

1718

return0;

19 }

輸出結果:

堆疊的公式化描述實現

堆疊和佇列可能是使用頻率最高的資料結構,二者都來自於線性表資料結構 經過某種限制以後 堆疊資料結構是通過對線性表的插入和刪除操作進行限制而得到的 插入和刪除操作都必須在表的同一端完成 因此,堆疊是乙個後進先出 last in first out,lifo 的資料結構。1 定義 定義 堆疊 堆疊 s ...

二叉樹實現

include include include include define maxsize 100 define ok 1 define error 0 define true 1 define false 0 typedef int status typedef int telemtype ty...

二叉樹實現

課內最近學了二叉樹,參考書上的 做了二叉樹的實現,尚不完善,還有很多地方不明白。二叉樹實現。define maxsize 100 include using namespace std 定義二叉樹節點 class btnode void createbt btnode bt,char str voi...