我有2个功能来创建树
struct tree * createNewNode(int data){ struct tree * newNode = malloc(sizeof(struct tree)); newNode-> data = data; newNode-> left = NULL; newNode-&放大器; …
该 insert() 和 createNode() 功能很好。
insert()
createNode()
该 inorder() 功能打印 empty 对于树中的每个空指针。然后崩溃,可能是因为它继续尝试递归调用 root->left 即使 root 一片空白。你可能应该在什么时候回来 root 一片空白。
inorder()
empty
root->left
root
仍然很难确定哪个节点与哪个节点相关。也许你应该使用更像这样的代码:
#include <stdio.h> #include <stdlib.h> struct tree { int data; struct tree *left; struct tree *right; }; static struct tree *createNewNode(int data) { struct tree *newNode = malloc(sizeof(struct tree)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } static struct tree *insert(struct tree *root, int data) { if (root == NULL) root = createNewNode(data); else if (data < root->data) root->left = insert(root->left, data); else root->right = insert(root->right, data); return root; } static void pr_indent(int level) { for (int i = 0; i < level; i++) printf(" "); } static void inorder(struct tree *root, int level) { if (root != NULL) { inorder(root->left, level + 1); pr_indent(level); printf("%d\n", root->data); inorder(root->right, level + 1); } } static void print_inorder(const char *tag, struct tree *root) { printf("%s: \n", tag); inorder(root, 0); putchar('\n'); } static void release(struct tree *node) { if (node != NULL) { release(node->left); release(node->right); free(node); } } int main(void) { struct tree *root = NULL; int values[] = { 37, 24, 30,36, 72, 57, 32, 62 }; enum { NUM_VALUES = sizeof(values) / sizeof(values[0]) }; for (int i = 0; i < NUM_VALUES; i++) { root = insert(root, values[i]); char tag[20]; snprintf(tag, sizeof(tag), "%d: After %d", i + 1, values[i]); print_inorder(tag, root); } release(root); return 0; }
示例输出:
1: After 37: 37 2: After 24: 24 37 3: After 30: 24 30 37 4: After 36: 24 30 36 37 5: After 72: 24 30 36 37 72 6: After 57: 24 30 36 37 57 72 7: After 32: 24 30 32 36 37 57 72 8: After 62: 24 30 32 36 37 57 62 72