樹,二叉樹的定義:
二叉樹是N個節點的有效集,二叉樹與無序數不同,二叉樹每個節點只有兩個子樹。
二叉樹的性質:
- 二叉樹的第i層最多有2的i-1次方個節點。
- 二叉樹最多有2的i次方減一個節點。
- 在任意一個二叉樹中,若葉子節點的個數為n,有兩個子樹的節點為n0,則有n=n0+1。
二叉樹的兩種形式:滿二叉樹與完全二叉樹
- 滿二叉樹:
滿二叉樹的每一個節點都有兩個子樹。除最下一層外不存在度數為一的節點。
n層的滿二叉樹,節點數為2的k次方減一。 - 完全二叉樹:
完全二叉樹的節點完全按照從上往下從左到右的順序填補。
最后一層總是在右部分空缺的樹。
完全二叉樹是滿二叉樹。滿二叉樹不一定是完全二叉樹。
二叉樹的存儲結構:
- 順序存儲結構
- 鏈式存儲結構
二叉樹的遍歷:
- 遍歷方案 :(簡單的遞歸遍歷)
-
中序遍歷(InorderTraversal):
typedef node* BinTree; void LNR (BinTree t){ if (t) { LNR (t->left); printf ("%d",t->date); LNR (t->right); } }
前序遍歷(PreorderTraversal):
void NLR (BinTree t){
if (t) {
printf ("%d",t->date);
NLR (t->left);
NLR (t->right);
}
}后序遍歷(PostorderTraversal):
void LRN (BinTree t){
if (t) {
LRN (t->left);
LRN (t->right);
printf ("%d",t->date);
}
}
二叉樹鏈式存儲的構造:
-
構造運算:(前序構造)
void creatBinTree (BinTree \*t) {//t為指向指針的指針,修改\*t既為修改指針 char temp;//定義一個存放數據的字符型數據 temp=getchar(); if (temp == '') \*t = NULL; else \*t = (BinTree *)malloc(sizeof(BinTree)); //生成節點 (\*t)->date = temp; creatBinTree (&(\*t)->left); creatBinTree (&(\*t)->right); } } //此函數的實參為根地址的地址
線索二叉樹:
- 定義:
具有 n 個結點的二叉鏈表中,其二叉鏈表的 n 個結點中共有 2n 個指針域,在這 2n 個指針域中,真正用于指向后件(左子結點或右子結點)的指針域只有 n-1 個,而另外的 n+1 個指針域都是空的。這樣就利用二叉鏈表中的空指針域,存放指向結點在某種遍歷次序下的前趨和后繼結點的指針(這種附加的指針稱為 " 線索 " ),這種加上了線索的二叉鏈表稱為線索鏈表,相應的二叉樹稱為線索二叉樹
根據線索性質的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和后序線索二叉樹三種。- 注意:線索鏈表解決了二叉鏈表找左、右孩子困難的問題,出現了無法直接找到該結點在某種遍歷序列中的前趨和后繼結點的問題。
部分內容引自下列blog及網站:
http://student.zjzk.cn/course_ware/data_structure/web/main.htm
http://waret.iteye.com/blog/709779