數據結構——樹的相關算法實現
阿新 • • 發佈:2018-05-06
std div 運行 data 左右子樹 blog etc 結構 post
二叉樹的基本算法
包括二叉樹的遍歷(先、中、後),二叉樹的層次,二叉樹的深度,二叉樹的葉子節點數計算。相關算法思想可以看書,這裏只是給出相關算法實現。
代碼實現
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 30
typedef char ElemType;
typedef struct TNode {
char data;
TNode * lchild;
TNode * rchild;
}TNode, *BiTree;
int IsEmpty_BiTree(BiTree *T) {
if (*T == NULL)
return 1;//如果樹為空一直進入死循環,直到輸入數據為止
else
return 0;
}
void Create_BiTree(BiTree *T){
char ch;
ch = getchar();
//當輸入的是"#"時,認為該子樹為空
if(ch == '#')
*T = NULL;
//創建樹結點
else{
*T = (BiTree)malloc(sizeof(struct TNode));
(*T)->data = ch; //生成樹結點
//生成左子樹
Create_BiTree(&(*T)->lchild);
//生成右子樹
Create_BiTree(&(*T)->rchild);
}
}
void TraverseBiTree(BiTree T) { //先序遍歷
if(T == NULL)//指針為空,說明節點不存在
return;
else {
printf("%c ",T->data);
TraverseBiTree(T->lchild);
TraverseBiTree(T->rchild);
}
}
void InOrderBiTree(BiTree T) { //中序遍歷
if(NULL == T)
return;
else {
InOrderBiTree(T->lchild);
printf("%c ",T->data);
InOrderBiTree(T->rchild);
}
}
void PostOrderBiTree(BiTree T) {
if(NULL == T)
return;
else {
InOrderBiTree(T->lchild);
InOrderBiTree(T->rchild);
printf("%c ",T->data);
}
}
int TreeDeep(BiTree T) {
int deep = 0;
if(T)
{
int leftdeep = TreeDeep(T->lchild);
int rightdeep = TreeDeep(T->rchild);
deep = leftdeep+1 > rightdeep+1 ? leftdeep+1 : rightdeep+1;
}
return deep;
}
//樹的葉子結點為
int Leafcount(BiTree T, int &num) {//一般涉及到變化的都會取地址
if(T)
{
if(T->lchild ==NULL && T->rchild==NULL)
{
num++;
printf("%c ",T->data);
}
Leafcount(T->lchild,num);
Leafcount(T->rchild,num);
}
return num;
}
//樹的層次顯示 (利用隊列,先進先出的原則可以完美實現)
void LevelOrder_BiTree(BiTree T){
//用一個隊列保存結點信息,這裏的隊列采用的是順序隊列中的數組實現
int front = 0;
int rear = 0;
BiTree BiQueue[MAXSIZE];
BiTree tempNode;
if(!IsEmpty_BiTree(&T)){
BiQueue[rear++] = T;
while(front != rear){//
//取出隊頭元素,並使隊頭指針向後移動一位
tempNode = BiQueue[front++];
//判斷左右子樹是否為空,若不為空,則加入隊列
if(!IsEmpty_BiTree(&(tempNode->lchild)))
BiQueue[rear++] = tempNode->lchild;
if(!IsEmpty_BiTree(&(tempNode->rchild)))
BiQueue[rear++] = tempNode->rchild;
printf("%c ",tempNode->data);
}
}
}
int main(void)
{
BiTree T;
BiTree *p = (BiTree*)malloc(sizeof(BiTree));
int deepth,num=0 ;
Create_BiTree(&T);//一般涉及到變化的都會取地址
printf("先序遍歷二叉樹:\n");
TraverseBiTree(T);
printf("\n");
printf("中序遍歷二叉樹:\n");
InOrderBiTree(T);
printf("\n");
printf("後序遍歷二叉樹:\n");
PostOrderBiTree(T);
printf("\n層次遍歷結果:");
LevelOrder_BiTree(T);
printf("\n");
deepth=TreeDeep(T);
printf("樹的深度為:%d",deepth);
printf("\n");
printf("樹的葉子結點為:");
Leafcount(T,num);
printf("\n樹的葉子結點個數為:%d",num);
return 0;
}
運行演示
二叉樹結構圖
參考文獻
- 數據結構-用C語言描述(第二版)[耿國華]
數據結構——樹的相關算法實現