一、專業術語:
1. 節點
2. 父節點
3. 子節點
4. 子孫
5. 堂兄弟、親兄弟
6. 深度:從根節點到最底層節點的層數,為深度。
7. 葉子節點:沒有子節點的節點就叫做葉子節點。
8. 非終端節點 == 非葉子節點
9. 度:子節點的個數。
二、樹的分類
2.1 一般樹
任意一個節點的子節點個數都不受限制。
2.2 二叉樹
任意一個節點的子節點最多兩個,且子節點樹不可更改。
分類:
1. 一般二叉樹
2. 滿二叉樹:在不增加層數的前提下,不能再增加一個節點的樹。
3. 完全二叉樹:如果只刪除了滿二叉樹的最底層最右邊連續的若干個(可以是0個)節點所形成的樹。
2.3 森林
n個互不相交的樹的集合。
三、樹存儲
1、二叉樹的存儲:
1.1 連續存儲[完全二叉樹]
優點:查找某個節點的父節點和子節點(也包括判斷有沒有子節點)的速度很快。
缺點:非常耗內存。
1.2 鏈式存儲
三個指針域:parent,left,right。
2、一般樹存儲
2.1 雙親表示法
2.2 孩子表示法
2.3 雙親孩子表示法
2.4 二叉樹表示法:左指針域指向左邊的第一個孩子節點,右指針域指向親兄弟
3、森林存儲:也是轉換為二叉樹存儲。
四、二叉樹的操作

五、二叉樹先序遍歷程序
//
// main.c
// 鏈式二叉樹
//
// Created by zhengbing on 2017/5/3.
// Copyright © 2017年 zhengbing. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
struct TNode {
char data;
struct TNode * left;
struct TNode * right;
};
struct TNode * creatNode(void); // 創建樹
void preTraverse(struct TNode * pRoot); // 先序遍歷
int main(int argc, const char * argv[]) {
struct TNode * pRoot = creatNode();
preTraverse(pRoot);
return 0;
}
void preTraverse(struct TNode * pRoot){
if (pRoot != NULL) {
printf("%c \n", pRoot->data);
preTraverse(pRoot->left);
preTraverse(pRoot->right);
}
}
struct TNode * creatNode(void){
struct TNode *pA = (struct TNode *)malloc(sizeof(struct TNode));
struct TNode *pB = (struct TNode *)malloc(sizeof(struct TNode));
struct TNode *pC = (struct TNode *)malloc(sizeof(struct TNode));
struct TNode *pD = (struct TNode *)malloc(sizeof(struct TNode));
struct TNode *pE = (struct TNode *)malloc(sizeof(struct TNode));
struct TNode *pF = (struct TNode *)malloc(sizeof(struct TNode));
struct TNode *pG = (struct TNode *)malloc(sizeof(struct TNode));
pA->data = 'A';
pB->data = 'B';
pC->data = 'C';
pD->data = 'D';
pE->data = 'E';
pF->data = 'F';
pG->data = 'G';
pA->left = pB;
pA->right = pC;
pB->left = pD;
pB->right = pF;
pC->left = pC->right = NULL;
pD->left = NULL;
pD->right = pE;
pE->left = pE->right = NULL;
pF->left = pG;
pF->right = NULL;
pG->left = pG->right = NULL;
return pA;
}
