首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言二叉樹完整實作:遞迴/非遞迴遍歷、層序、屬性統計與平衡判斷(含測試資料)

     編輯:關於C語言

資料結構定義

typedef char ElemType;
typedef struct Node {
    ElemType data;
    struct Node *lchild, *rchild;
} BTree;

#define OK 1
#define ERROR 0
#define OVERFLOW -1

核心功能模組

模組檔案關鍵函數
二叉樹BinaryTree.h/.c建立、各式遍歷、深度、葉子、度統計、平衡判斷、層次查找、交換子樹
佇列Queue.h/.c循環佇列:初始化、入隊、出隊、空/滿判斷(層序遍歷用)
堆疊Stack.h/.c動態陣列堆疊:初始化、推入、彈出、取頂、空判斷(非遞迴遍歷用)

遍歷演算法對比

遍歷遞迴版非遞迴版核心邏輯
前序根→左→右堆疊存根,一直向左,彈出轉右
中序左→根→右堆疊存根,一直向左,彈出訪問根,轉右
後序左→右→根雙堆疊或單堆疊+標記陣列(0=左訪問完,1=右訪問完)
層序—佇列 BFS:根入隊,出隊訪問,子節點入隊

關鍵非遞迴實作節錄

中序

void InOrderNonRec(BTree *root) {
    Stack s; InitStack(&s);
    BTree *p = root;
    while (p || !IsStackEmpty(s)) {
        if (p) { Push(&s, p); p = p->lchild; }
        else { Pop(&s, &p); visit(p); p = p->rchild; }
    }
}

後序(標記法)

void PostOrderNonRec(BTree *root) {
    BTree *stack[MAX], *p = root;
    int tag[MAX], top = 0;
    while (p || top) {
        while (p) { stack[++top] = p; tag[top] = 0; p = p->lchild; }
        if (tag[top] == 1) { p = stack[top--]; visit(p); p = NULL; }
        else { p = stack[top]; p = p->rchild; tag[top] = 1; }
    }
}

測試資料與輸出

輸入序列(先序,# 表空):ABC##DE#G##F###

對應樹結構:
        A
       / \
      B   F
     / \
    C   D
         \
          E
           \
            G

執行結果摘要

  • 前序:ABCDEGF
  • 中序:CBDGEFA
  • 後序:CGEFDBA
  • 層序:ABFCDEG
  • 深度:5
  • 葉子:C、G、F(3 個)
  • 度 1 節點:B、D、E(3 個)
  • 度 2 節點:A(1 個)
  • 總節點:7
  • 平衡判斷:否(左子樹深 4,右子樹深 1)
  • 層次查找:A=1, B=2, C=3, D=3, E=4, F=2, G=5, M=0

交換左右子樹後驗證

呼叫 SwapLeftRightSubtree 後,前序變為 AFBEDGC,結構鏡像翻轉,所有統計數值不變。

編譯與執行

gcc -std=c11 -Wall -Wextra -O2 BinaryTree.c Queue.c Stack.c -o btree
echo "ABC##DE#G##F###" | ./btree

完整代碼結構模組化、註釋詳盡,適合資料結構教學與面試準備。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved