insert(root, tree) 參數順序反、邏輯顛倒:應為 insert(&root, new_node) 修改根指針。new 是 C++ 關鍵字,C 語言用 malloc,變量名不能用 new。tree->left = root 顛倒,應掛在 root->left。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 語言操作鏈表、樹等動態結構的核心鑰匙。