數據結構之二叉樹的代碼實現 C語言版

前言

樹是一種結合了另外兩種數據結構的優點的結構
一種是順序表,樹結構的查詢速度和有序數組一樣快
一種是鏈表,樹結構的插入數據和刪除數據速度和鏈表一樣快
在樹的操作中,大量運用了遞歸的原理

1.二叉樹的結構體表示

這個表示和前面鏈表的結構體表示有點類似,不過他內部包含了兩個指針域。
大概可以這麼理解,鏈表是一維的,你可以認爲他只有寬度,而二叉樹是二維的,既有深度也有“寬度”,有明顯的層次關係,比鏈表要複雜一些

typedef struct BTNode
{
	TElemType data;
	struct BTNode *lchild,*rchild;
}BTNode,*BTree;

2.一些操作

二叉樹的一些基本操作包括了創建,三種遍歷,求結構個數,深度,葉子結點數
而這些操作中,都用到了遞歸的方法
以一顆二叉樹作爲典型:

二叉樹

3.前序創建

二叉樹用前序創建,空用‘#’來表示
如圖:
前序遍歷
遍歷結果爲:
ABDH#K###E##CFI###G#J##

代碼

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0
typedef char TElemType;

//二叉樹的二叉鏈表的結點結構定義代碼
typedef struct BTNode
{
	TElemType data;
	struct BTNode *lchild,*rchild;
}BTNode,*BTree;

void CreatBTree(BTree *T);//前序遍歷生成二叉樹
void PrtOrderTraverse(BTree T);//前序遍歷二叉樹
void InOrderTraverse(BTree T);//中序遍歷二叉樹
void PostOrderTraverse(BTree T);//後序遍歷二叉樹
int Deep(BTree T);//求樹的深度
int NodeCount(BTree T);//求樹的結點數
int LeafCount(BTree T);//統計二叉樹中葉子結點的個數

int main()
{
	BTree T = NULL;
	printf("先序遍歷生成二叉樹\n");
	CreatBTree(&T);
	printf("前序遍歷\n");
	PrtOrderTraverse(T);
	printf("\n");
	printf("中序遍歷\n");
	InOrderTraverse(T);
	printf("\n");
	printf("後序遍歷\n");
	PostOrderTraverse(T);
	printf("\n");
	int m = Deep(T);
	printf("樹的深度:%d\n",m);
	int n = NodeCount(T);
	printf("樹的結點數:%d\n",n);
	int y = LeafCount(T);
	printf("葉子結點數:%d\n",y);
}

//前序遍歷生成二叉樹
void CreatBTree(BTree *T)
{
	TElemType ch;
	scanf("%c",&ch);
	if(ch == '#')
		*T = NULL;
	else
	{
		*T = (BTree)malloc(sizeof(BTNode));
		if(!*T)
			printf("失敗\n");
		(*T)->data = ch;
		CreatBTree(&(*T)->lchild);//左子樹
		CreatBTree(&(*T)->rchild);//右子樹
	}
}

//前序遍歷二叉樹
void PrtOrderTraverse(BTree T)
{
	if(T == NULL)
		return;
	printf("%c ",T->data);
	PrtOrderTraverse(T->lchild);
	PrtOrderTraverse(T->rchild);
}

//中序遍歷二叉樹
void InOrderTraverse(BTree T)
{
	if(T == NULL)
		return;
	InOrderTraverse(T->lchild);
	printf("%c ",T->data);
	InOrderTraverse(T->rchild);
}

//後序遍歷二叉樹
void PostOrderTraverse(BTree T)
{
	if(T == NULL)
		return;
	PostOrderTraverse(T->lchild);
	PostOrderTraverse(T->rchild);
	printf("%c ",T->data);
}

int Deep(BTree T)
{
	if(T == NULL)
		return 0;
	else
	{
		int m = Deep(T->lchild);
		int n = Deep(T->rchild);
		if(m>n)
			return (m+1);
		else
			return (n+1);
	}
}

int NodeCount(BTree T)
{
	if(T == NULL)
		return 0;
	else
		return NodeCount(T->lchild) + NodeCount(T->rchild) +1;
}

int LeafCount(BTree T)//統計二叉樹中葉子結點的個數
{
    if(!T)
		return 0;
    if(!T->lchild &&!T->rchild)//如果二叉樹左子樹和右子樹皆爲空,說明該二叉樹根節點爲葉子節點,加1.
	{
        return 1;
    }
	else
	{
        return LeafCount(T->lchild)+LeafCount(T->rchild);
    }
}

運行結果

運行結果

後記

當然,樹是一種很複雜的數據結構,還有比如二叉排序樹(二叉查找樹),平衡二叉樹,紅黑樹等。我們會在查找那一章中進行解答。

今天的內容就是二叉樹的基本操作及其內容,喜歡我的多多支持哦~

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