1、二叉樹簡介:二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。
相關知識:
樹的深度:樹中最大的結點層。
結點的度:結點子樹的個數。
樹的度: 樹中最大的結點度。
葉子結點:也叫終端結點,是度爲 0 的結點;
分枝結點:度不爲0的結點;
滿二叉樹:除了葉子節點外,爲一個節點都有左右子樹的二叉樹,每一層都滿的二叉樹。
完全二叉樹:樹中只有最後一層有空缺且從右向左連續空缺的二叉樹。
平衡二叉樹:又稱AVL樹,數中的每個節點左右子樹高度差最多不想差1。
把一棵完全二叉樹從上到下,從左到右依次編號,其中編號爲i的點(1<i<n),若滿足2i<n則該節點的左子樹爲2i,右子樹爲2i+1.
2、二叉樹性質:
(1) 在非空二叉樹中,第i層的結點總數不超過,i≥1。
(2) 深度爲h的二叉樹最多有個結點(h>=1),最少有個結點。
(3) 對於任意一棵二叉樹,如果其葉結點數爲,而度數爲2的結點總數爲,則。
(4) 具有n個結點的完全二叉樹的深度爲。
(5)把一棵完全二叉樹從上到下,從左到右依次編號,其中編號爲i的點(1<i<n),若滿足2i<n則該節點的左子樹爲,右子樹爲。
3、二叉樹的聲名與創建:遞歸建樹。
typedef struct binarytree
{
char nValue;
struct binarytree *pleft;
struct binarytree *pright;
}bitree;
void CreateBiTree(binarytree **pTree)
{
char nNum;
scanf("%c",&nNum);
if(nNum == '0')return;
//根
*pTree = (binarytree*)malloc(sizeof(binarytree));
(*pTree)->nValue = nNum;
(*pTree)->pleft = NULL;
(*pTree)->pright = NULL;
//左
CreateBiTree(&((*pTree)->pleft));
//右
CreateBiTree(&((*pTree)->pright));
}
4、二叉樹的遍歷:
(1)先序遍歷:首先訪問根,再先序遍歷左子樹,最後先序遍歷右子樹。(根左右)
void PreorderTraversal(binarytree *pTree)
{
if(pTree == NULL)return;
//根
printf("%d ",pTree->nValue);
//左
PreorderTraversal(pTree->pleft);
//右
PreorderTraversal(pTree->pright);
}
(2)中序遍歷:首先中序遍歷左子樹,再訪問根,最後中序遍歷右子樹。(左右根)
void InorderTraversal(binarytree *pTree)
{
if(pTree == NULL)return;
//左
InorderTraversal(pTree->pleft);
//根
printf("%d ",pTree->nValue);
//右
InorderTraversal(pTree->pright);
}
(3)後序遍歷:首先後序遍歷左子樹,再後序遍歷右子樹,最後訪問根。(左右根)
void LastorderTraversal(binarytree *pTree)
{
if(pTree == NULL)return;
//左
LastorderTraversal(pTree->pleft);
//右
LastorderTraversal(pTree->pright);
//根
printf("%d ",pTree->nValue);
}
(4)層序遍歷:即按照層次訪問,先訪問根,訪問左右兒子,再訪問兒子的兒子。
二叉樹遍歷示例: