本程序實現一個交互式二叉樹構建系統,用戶通過控制台輸入節點值與導航指令,動態創建樹結構,最後以縮進格式可視化輸出樹形結構。代碼展示了動態內存管理、遞歸遍歷、指針操作等C語言核心技能。
typedef struct TreeNode {
int value; // 節點數值
int level; // 深度層級(用於縮進顯示)
struct TreeNode *leftChild;
struct TreeNode *rightChild;
struct TreeNode *parent; // 父節點指針,支持向上導航
} TreeNode, *Tree;
設計亮點:包含 parent 指針與 level 字段,使樹具備「雙向導航」與「可視化深度」能力,超越教科書基礎定義。
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;
}
用戶操作流程:
這種「游標式」構建方式直觀模擬了樹的層級結構,適合教學演示。
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 字段實現樹形結構文本渲染 |
本程序雖屬教學範例,但完整展示了「從數據定義到用戶交互、從構建到銷毀」的完整生命周期,是理解指針、遞歸、動態數據結構的優秀實踐案例。