首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言二叉樹插入與遍歷 Bug 修復:指針傳遞、遞歸邏輯與記憶體管理

     編輯:程式設計綜合問答

原代碼主要問題

  1. insert(root, tree) 參數順序反、邏輯顛倒:應為 insert(&root, new_node) 修改根指針。
  2. new 是 C++ 關鍵字,C 語言用 malloc,變量名不能用 new。
  3. 插入邏輯 tree->left = root 顛倒,應掛在 root->left。
  4. 主函數未取址傳遞 tree,導致根節點永遠為 NULL。

修正後完整代碼

#include <stdio.h>
#include <stdlib.h>

typedef struct TNode {
    struct TNode *left;
    struct TNode *right;
    int data;
} TNode;

// 建立節點
TNode* create_node(int data) {
    TNode *node = (TNode*)malloc(sizeof(TNode));
    node->left = node->right = NULL;
    node->data = data;
    return node;
}

// 插入:雙重指針修改根
void insert(TNode **root, TNode *node) {
    if (*root == NULL) {
        *root = node;
        return;
    }
    if (node->data < (*root)->data) {
        insert(&(*root)->left, node);
    } else if (node->data > (*root)->data) {
        insert(&(*root)->right, node);
    }
    // 相等值忽略或按需處理
}

// 先序遍歷輸出
void print_preorder(TNode *root) {
    if (root == NULL) return;
    printf("%d ", root->data);
    print_preorder(root->left);
    print_preorder(root->right);
}

// 釋放樹
void free_tree(TNode *root) {
    if (root == NULL) return;
    free_tree(root->left);
    free_tree(root->right);
    free(root);
}

int main() {
    TNode *root = NULL;
    int n, val;
    printf("輸入節點數: ");
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        printf("輸入值 %d: ", i+1);
        scanf("%d", &val);
        insert(&root, create_node(val));  // 關鍵:傳遞根地址
    }
    printf("先序遍歷: ");
    print_preorder(root);
    printf("\n");
    free_tree(root);
    return 0;
}

關鍵修正點總結

  • 雙重指針 TNode**:讓遞歸能修改父節點的 left/right 指針(或根指針)。
  • 插入邏輯:比較 node->data 與 (*root)->data,遞歸進入對應子樹。
  • 記憶體管理:malloc 配對 free,避免洩漏。
  • 輸入檢查:scanf 返回值檢查、範圍驗證(此處略)。

掌握指針的指針,是 C 語言操作鏈表、樹等動態結構的核心鑰匙。

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