前言
樹是一種結合了另外兩種數據結構的優點的結構
一種是順序表,樹結構的查詢速度和有序數組一樣快
一種是鏈表,樹結構的插入數據和刪除數據速度和鏈表一樣快
在樹的操作中,大量運用了遞歸的原理
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);
}
}
運行結果
後記
當然,樹是一種很複雜的數據結構,還有比如二叉排序樹(二叉查找樹),平衡二叉樹,紅黑樹等。我們會在查找那一章中進行解答。
今天的內容就是二叉樹的基本操作及其內容,喜歡我的多多支持哦~