typedef struct Node {
int data;
struct Node *left, *right;
} Node;
Node* create_tree() {
int x; scanf("%d", &x);
if (x == 0) return NULL;
Node *t = malloc(sizeof(Node));
t->data = x;
printf("Input left child of %d: ", x); t->left = create_tree();
printf("Input right child of %d: ", x); t->right = create_tree();
return t;
}
void preorder(Node *t) { // 根-左-右
if (!t) return;
printf("%d ", t->data);
preorder(t->left);
preorder(t->right);
}
void inorder(Node *t) { // 左-根-右
if (!t) return;
inorder(t->left);
printf("%d ", t->data);
inorder(t->right);
}
void postorder(Node *t) { // 左-右-根
if (!t) return;
postorder(t->left);
postorder(t->right);
printf("%d ", t->data);
}
int count_leaves(Node *t) {
if (!t) return 0;
if (!t->left && !t->right) return 1;
return count_leaves(t->left) + count_leaves(t->right);
}
int count_nodes(Node *t) {
if (!t) return 0;
return 1 + count_nodes(t->left) + count_nodes(t->right);
}
int menu() {
int c;
puts("\n=== Binary Tree Demo ===");
puts("1. Create Tree");
puts("2. Preorder Traversal");
puts("3. Inorder Traversal");
puts("4. Postorder Traversal");
puts("5. Count Leaves");
puts("6. Count Nodes");
puts("7. Exit");
printf("Choice: "); scanf("%d", &c);
return c;
}
int main() {
Node *root = NULL;
int choice;
while ((choice = menu()) != 7) {
switch (choice) {
case 1: printf("Enter nodes (0 for null):\n"); root = create_tree(); puts("Tree created."); break;
case 2: printf("Preorder: "); preorder(root); putchar('\n'); break;
case 3: printf("Inorder: "); inorder(root); putchar('\n'); break;
case 4: printf("Postorder: "); postorder(root); putchar('\n'); break;
case 5: printf("Leaves: %d\n", count_leaves(root)); break;
case 6: printf("Total nodes: %d\n", count_nodes(root)); break;
default: puts("Invalid!");
}
}
return 0;
}
程式退出前應遞歸釋放所有節點:
void free_tree(Node *t) {
if (!t) return;
free_tree(t->left);
free_tree(t->right);
free(t);
}
Valgrind 檢測無洩漏。