二进制搜索树按顺序打印

时间:2018-04-26 08:00:54

标签: c binary-search-tree

我正在尝试将某些内容插入到二叉树中,我想通过使用有序打印功能来查看内部的内容。似乎在“print_bst_node(root-> left);”中抛出异常。说“抛出异常:读取访问冲突”。每次我运行程序。这个功能有问题吗?

编辑,添加了insert_bst包装函数。

//bst.h

    typedef struct bstNode { //pointer to the bst 
        long data;  //storing long data types from -2,147,483,648 to 2,147,483,647
        List courses; //this is the list of courses 
        struct bstNode *left; //left child of the tree
        struct bstNode *right; //right child of the tree
    } *BSTNodePtr;

    typedef struct bst {
        BSTNodePtr root; //points to the root of the tree 
    } BST;

//bst.c 

    void print_bst_node(BSTNodePtr root) {
        if (root != NULL) {
            print_bst_node(root->left);
            printf("%ld ", root->data);
            print_bst_node(root->right);
        }
        else {
            printf("Nothing to see here");
        }
    }

BSTNodePtr insert_bst_node(BSTNodePtr self, long n) { 
    if (self == NULL) {
        self = malloc(sizeof *self);
        self->data = n;
        self->courses = new_list(); //creates a new linked list in the binary search tree nodes.
        self->left = self->right = NULL;
    }
    else if (n < self->data) {
        self->left = insert_bst_node(self->left, n);
    }
    else if (n > self->data) {
        self->right = insert_bst_node(self->right, n);
    }
    return self;
}


void insert_bst(BST *self, long n) { //wrapper function for insert_bst_node
    self->root = insert_bst_node(self->root, n);
} 
//main.c 

void add_to_bst(BST *self) { 
    long input = 0;

    printf("Enter student ID\n");
    scanf("%ld", &input);
    insert_bst(self, input);
    print_bst_node(self);
}

4 个答案:

答案 0 :(得分:2)

问题出现了,因为您将不兼容的指针作为参数传递给print_bst_node()函数。 print_bst_node()参数的类型为BSTNodePtr

void print_bst_node(BSTNodePtr root) {

您正在将self传递给它:

print_bst_node(self);

是指向BST类型的指针:

void add_to_bst(BST *self) { 

相反,您应该将self->root传递给print_bst_node()

print_bst_node(self->root);

编译器必须抛出警告消息以传递不兼容的指针类型。

答案 1 :(得分:1)

print_bst_node函数会打印大量"Nothing to see here"条消息!

除此之外,似乎没问题,只要我们可以推断......你没有提供BSTNodePtr的声明。

问题出在其他地方:

  • 节点指针leftright可能在分配或声明时未正确初始化
  • 从树中插入或删除节点时,可能无法正确更新节点指针。

使用代码更新您的问题,以获得更详细的答案的完整示例。

答案 2 :(得分:0)

每当您创建节点时,该节点必须将其所有左右子项设置为NULL(void *) 0

答案 3 :(得分:0)

添加新节点时,您应该将其值归属,然后将 - &gt; left - &gt;右侧归属为NULL,否则您将遇到类似函数的问题。因为停止案例正在寻找NULL并且不会有一个(它很可能会读取存储点处的垃圾)。

之后,您创建的功能非常好:)