- 參考內容:http://data.biancheng.net/tree/
一、基本內容
-
二叉樹的創建(先順遍歷的方法)
-
二叉樹的先序遍歷
-
二叉樹的中序遍歷
-
二叉樹的後序遍歷
-
哈夫曼樹的創建與哈夫曼編碼
二、實驗內容
二叉樹結點結構體
typedef struct BitTree
{
char data;
struct BitTree *lchild,*rchild;
}BitTree;
1. 鏈式先序二叉樹的創建
(1)鏈式二叉樹創建思想:創建結點輸入結點數據,判斷是否結束,遞歸函
數創建當前結點的左子樹,左子樹創建結束後,遞歸函數創建右子樹;結束後返回根結點。
(2)代碼實現
BitTree *Creat(BitTree *root)
{
char c;
puts("輸入結點的值,輸入0時結束。");
scanf("%c",&c);
//putchar(c);
fflush(stdin);
if(c=='0')
root = NULL;
else
{
root =(BitTree *)malloc(sizeof(BitTree));
root->data=c;
root->lchild=Creat(root->lchild);
root->rchild=Creat(root->rchild);
}
return root;
}
2. 二叉樹的先序遍歷
(1)先序遍歷思想:訪問根結點、訪問當前節點的左樹、訪問當前節點的右樹。
(2)先序遍歷流程:
-
訪問結點1,讀取節點1的數據1
-
進入結點1 的左子樹2,讀取當前結點的數據2
-
進入結點2 的左子樹4,讀取當前結點的數據4
-
結點4沒有子樹,退回到結點2
-
進入節點2的右子樹5,讀取數據5
-
節點5沒有子樹,退回到結點1,節點1點左子樹遍歷完畢。
-
進入結點1的右子樹3
……
先序遍歷上圖二叉樹的結果爲:1245367
(3)代碼實現
void Ftraverse(BitTree *root)
{
char c;
if(root!=NULL)
{
c=root->data;
printf("%c ",c);
Ftraverse(root->lchild);
Ftraverse(root->rchild);
}
}
3. 中序遍歷
(1)中序遍歷思想:訪問當前結點的左子樹,訪問根結點,訪問當前結點的右子樹。即訪問結點的左子樹,
沒有左子樹就退回來讀取當前結點,然後再進入右結點。
中序遍歷結果:4251637
(2)代碼實現
void Mtraverse(BitTree *root)
{
char c;
if(root!=NULL)
{
Mtraverse(root->lchild);
printf("%c",root->data);
Mtraverse(root->rchild);
}
}
4. 後序遍歷
後序遍歷思想:從根結點出發,遍歷結點的左右子樹,當左右子樹遍歷完成後,訪問該結點的數據。
上圖後序遍歷結果爲:4526731
代碼實現:
void Ltraverse(BitTree *root)
{
char c;
if(root!=NULL)
{
Ltraverse(root->lchild);
Ltraverse(root->rchild);
printf("%c",root->data);
}
}
哈夫曼樹與哈夫曼編碼
哈夫曼樹本質上是二叉樹,是經過權重優化後的二叉樹。通過哈夫曼樹對數據優化這一特性,可以對數
據進行編碼。哈夫曼編碼在數組中建構。