樹的定義:樹( 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...