1. 程式人生 > >數據結構——樹的相關算法實現

數據結構——樹的相關算法實現

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語言描述(第二版)[耿國華]

數據結構——樹的相關算法實現