二叉樹的基本操作 創建、先序、中序、後序遍歷

  • 參考內容: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. 進入結點1 的左子樹2,讀取當前結點的數據2

  3. 進入結點2 的左子樹4,讀取當前結點的數據4

  4. 結點4沒有子樹,退回到結點2

  5. 進入節點2的右子樹5,讀取數據5

  6. 節點5沒有子樹,退回到結點1,節點1點左子樹遍歷完畢。

  7. 進入結點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);
	}	
	
}

哈夫曼樹與哈夫曼編碼

哈夫曼樹本質上是二叉樹,是經過權重優化後的二叉樹。通過哈夫曼樹對數據優化這一特性,可以對數

據進行編碼。哈夫曼編碼在數組中建構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章