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

C語言實現二叉樹構建與遍歷:交互式動態創建完整教學

     編輯:關於C

項目概覽

本程序實現一個交互式二叉樹構建系統,用戶通過控制台輸入節點值與導航指令,動態創建樹結構,最後以縮進格式可視化輸出樹形結構。代碼展示了動態內存管理、遞歸遍歷、指針操作等C語言核心技能。

數據結構設計

typedef struct TreeNode {
    int value;           // 節點數值
    int level;           // 深度層級(用於縮進顯示)
    struct TreeNode *leftChild;
    struct TreeNode *rightChild;
    struct TreeNode *parent;  // 父節點指針,支持向上導航
} TreeNode, *Tree;

設計亮點:包含 parent 指針與 level 字段,使樹具備「雙向導航」與「可視化深度」能力,超越教科書基礎定義。

核心功能模塊

1. 節點創建 SetChild()

Tree *SetChild(int value, Tree *parentT) {
    Tree *node = (Tree *)malloc(sizeof(TreeNode));
    node->value = value;
    node->parent = parentT;
    node->leftChild = node->rightChild = NULL;
    node->level = parentT->level + 1;  // 深度自動計算
    return node;
}
  • 動態分配內存
  • 建立父子雙向關聯
  • 自動計算層級(根為0)

2. 交互式構建主循環

用戶操作流程:

  1. 輸入根節點值
  2. 循環提示:為當前節點輸入左/右子節點值(≤0 表示不創建)
  3. 選擇導航:1=返回父節點、2=進入左子、3=進入右子、4=退出構建

這種「游標式」構建方式直觀模擬了樹的層級結構,適合教學演示。

3. 先序遍歷可視化 View_Tree()

void View_Tree(Tree *pThis) {
    mk_space(pThis->level);  // 根據深度打印縮進
    printf("%d\n", pThis->value);
    if (pThis->leftChild)  View_Tree(pThis->leftChild);
    if (pThis->rightChild) View_Tree(pThis->rightChild);
}

void mk_space(int nums) {
    for (int k = 0; k < nums * 2; k++) putchar(' ');
}

輸出示例:

1
  2
    4
    5
  3
    6

內存管理與缺陷分析

⚠️ 嚴重問題:釋放邏輯錯誤

free(k);  // 僅釋放根節點!所有子節點內存洩漏!

正確釋放需後序遍歷遞歸釋放:

void Free_Tree(Tree *node) {
    if (!node) return;
    Free_Tree(node->leftChild);
    Free_Tree(node->rightChild);
    free(node);
}

其他改進建議

  • 輸入驗證:scanf 返回值檢查,防止非數字輸入導致死循環
  • 內存分配檢查:malloc 可能返回 NULL
  • 遍歷方式擴展:增加中序、後序、層序遍歷選項
  • 持久化:支持將樹保存到文件/從文件加載

教學價值總結

知識點代碼體現
動態內存分配malloc/free 管理節點生命周期
指針與結構體多指針字段構建複雜數據結構
遞歸算法樹的遍歷與釋放天然適合遞歸
交互式程序設計狀態機思想:當前節點游標 + 用戶指令驅動
可視化輸出利用 level 字段實現樹形結構文本渲染

進階擴展方向

  • 實現二叉搜索樹(BST):插入時自動比較大小定位位置
  • 添加刪除節點功能(含三種情況處理)
  • 引入平衡因子實現 AVL/紅黑樹
  • 圖形化界面:配合 ncurses/Web 前端實現樹的圖形渲染

本程序雖屬教學範例,但完整展示了「從數據定義到用戶交互、從構建到銷毀」的完整生命周期,是理解指針、遞歸、動態數據結構的優秀實踐案例。

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