二叉樹
n(n>=0)個結點的有限集合:(五種形態)
1.或者為空二叉樹,n=0;
2.或者由一個根結點和兩個互不相交的被稱為根的左子樹和右子樹組成。左子樹和右子樹又分別是一棵二叉樹。
3.每個結點最多有2棵子樹
4.左右子樹有順序
特殊二叉樹
一.斜樹
二.滿二叉樹:1.分支結點都存在左右子樹 2.葉子都在同一層 3.非葉子結點的度一定為2 4.相同深度二叉樹中滿二叉樹結點個數最多,葉子樹最多
三.完全二叉樹:編號與同高度的滿二叉樹一一對應。
1.葉子結點只可能在層次最下面的兩層出現,集中在左部連續位置;
2.若有度為1的結點,只可能有一個,且該結點只有左孩子沒有右孩子;
3.同樣結點樹的二叉樹,完全二叉樹的深度是最小的。
二叉樹的數學等式
1.非空二叉樹上葉子結點數等於度為2的結點樹加1;
2.非空二叉樹上第k層至多有2k-1個結點(k>=1);
3.高度為H的二叉樹至多有2H-1個結點(H>=1)
4.具有N個(N>0)的結點的完全二叉樹的高度為[log2(N+1)]或[log2N+1];
遍歷二叉樹
遞歸先序遍歷
void PreOrder(BiTree T){ if(T!=NULL){ printf("%c",T->data); //訪問根結點 PreOrder(T->lchild); //遞歸遍歷左子樹 PreOrder(T->rchild); //遞歸遍歷右子樹 } }
遞歸中序遍歷
void InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild); //遞歸遍歷左子樹 printf("%c",T->data); //訪問根結點 InOrder(T->rchild); //遞歸遍歷右子樹 } }
遞歸后序遍歷
void PostOrder(BiTree T){ if(T!=NULL){ PostOrder(T->lchild); //遞歸遍歷左子樹 PostOrder(T->rchild); //遞歸遍歷右子樹 printf("%c",T->data); //訪問根結點 } }
哈夫曼樹
權:樹中結點相關的數據。
路徑長度:從樹的某個結點到另一個結點之間的分支數目(經過的邊數)。
帶權路徑長度:從樹的根結點到任意結點的路徑長度與該結點上權值的乘積。
樹中所有葉結點的帶權路徑長度之和=該樹的帶權路徑長度 即WPL。