嚴蔚敏 資料結構 二叉樹鏈式儲存結構 遍歷等操作
阿新 • • 發佈:2019-02-11
課本 《資料結構(C語言版)(第2版)》 嚴蔚敏版
樹結構的學習。
編譯環境:DEV C++
檔案格式為 cpp(c++檔案型別),前者的引用函式,在 C 的情況下沒完成。
實現:
二叉樹的先序遍歷建立,三種遍歷方法,葉子節點的查詢等。
參考 code:
#include <stdio.h> #include <stdlib.h> #define Shyazhut 0//條件啟用求葉子節點的函式:0 不使用 const int MYDD = 1103; typedef struct BiTNode { char data;//節點資料域 struct BiTNode *lc, *rc;//節點左右孩子 } BiTNode, *BiTree; void CreatBiTree(BiTree &T); void InitBiTree(BiTree &T); void PreorderTraversal(BiTree T);//先序遍歷 void InOrderTraveres(BiTree T);//中序遍歷 void PostTraversing(BiTree T);//後序遍歷 int GetLeaves(BiTree T);//求葉子節點 int LeavesSum = 0;//全域性變數葉子節點統計 int main() { int i,n; BiTree T; InitBiTree(T); CreatBiTree(T); puts("\n先序遍歷二叉樹的結果:"); PreorderTraversal(T); puts("\n\n中序遍歷二叉樹的結果:"); InOrderTraveres(T); puts("\n\n後序遍歷二叉樹的結果:"); PostTraversing(T); printf("\n\n葉子節點的個數有 %d 個(先序遍歷中求得).\n", LeavesSum); #if Shyazhut printf("葉子節點的個數有 %d 個(求葉子節點函式求得).\n", GetLeaves(T)); #endif free(T); return 0; } void InitBiTree(BiTree &T) {//節點初始化 T = (BiTNode*)malloc(sizeof(BiTNode));//malloc()的返回值可以強制型別轉換 T -> lc = NULL; T -> rc = NULL; printf("請以先序的方式鍵入二叉樹節點資訊。\n"); } void CreatBiTree(BiTree &T) {//先序遍歷的方式構造二叉樹 char ch; scanf("%c", &ch); if(ch == '#') T = NULL; else { T=(BiTNode*)malloc(sizeof(BiTNode)); if(!T) return; T -> data = ch; CreatBiTree(T->lc); CreatBiTree(T->rc); } } /*三種遍歷*/ void PreorderTraversal(BiTree T) { if(T==NULL) return; printf("%c ", T -> data); if((T -> lc == NULL) && (T -> rc == NULL)) LeavesSum++;//葉子節點的統計 PreorderTraversal(T->lc); PreorderTraversal(T->rc); } void InOrderTraveres(BiTree T) { if(T == NULL) return; InOrderTraveres(T -> lc); printf("%c ", T -> data); InOrderTraveres(T -> rc); } void PostTraversing(BiTree T) { if(T == NULL) return; PostTraversing(T -> lc); PostTraversing(T -> rc); printf("%c ", T -> data); } #if Shyazhut int GetLeaves(BiTree T) {//葉子節點的統計 if(!T) { LeavesSum += GetLeaves(T -> lc); if((T -> lc == NULL) && (T -> rc == NULL)) LeavesSum++; LeavesSum += GetLeaves(T -> rc); } return LeavesSum; } #endif /* 測試資料 ABC##DE#G##F### */