我正在制作代码树,数据结构。但是在打印过程中出现了错误

i`m making code tree, data structure. However, there is an error in the printing process

插入过程好像没有问题,但是打印的时候只输出了根节点。问题是什么? 文本错误

  1. n = (节点*)m(sizeof(节点))
  2. 打印、扫描

数据结构,树

    struct node {
    int data;
    node* l, *r;
};
node* Insert(node* st, int item)
{
    node* n, * p; p = st;
    n = (node*)m(sizeof(node));
    n->data = item; n->l = NULL; n->r = NULL;

    if (st == NULL) {
        return n;
    }

    while (p != NULL) {
        if (p->data > item) {
            p = p->l;
        }
        else p = p->r;
    }
    p = n;

    return st;

}
node* st = NULL;
    node* a = NULL;
    while (1) {
        print("\n트리 1)삽입 2)삭제 3)전위순회 출력 4) 종료 "); scan("%d", &menu);
        if (menu == 4) break;

        switch (menu) {
        case 1:
            print("삽입할 값 입력 : "); scan("%d", &item);
            st = Insert(st, item);
            break;
        case 2:
            a = st;
            print("%d", a->data); a = a->l; print("%d", a->data); a = st->r; print("%d", a->data);
            break;

撇开语法和样式问题不谈,我注意到您的 Insert 函数中存在逻辑错误。看来您正在实施二叉搜索树并且您正在正确地遍历树。但是,您实际上并没有插入到树中,因为节点 p 并未指向树中;它只是节点的一个副本。

考虑一下当我们有下面的树时会发生什么:

     1
   /   \
 NULL  NULL

让我们将 2 插入树中。

Insert(st, 2)
Step 1: p is a COPY of the root of st, which is node 1
     1 ==  p
   /   \
  NULL NULL

Step 2: Because p->data == 1 < 2, we move to the right and hit NULL
     1
   /   \
  NULL NULL == p

Now we assign p to the new node n:
     1
   /   \
  NULL  NULL; p = n

正如你在上面看到的,我们实际上并没有link新节点到根;我们所做的只是遍历到树中的正确位置,然后将新节点 n 分配给 p,这实际上并没有写入树;它只是给出 p n 指向的节点的地址。它实际上并没有改变我们想要改变的节点地址。

一个解决方案(这似乎是您的意图)是让 p 成为指向节点指针 (node **) 的指针。您可以在此答案 here.

中找到有关双指针的更多详细信息

如果我们 p 指向每个节点,下面是一个可视化。

Insert(st, 2)
Step 1: Let p be a pointer to the root of st, which is node 1
     1 <- p
   /   \
  NULL NULL

Step 2: Because (*p)->data == 1 < 2, we move to the right (p = &((*p)->right)) and have *p == NULL
     1
   /   \
  NULL NULL <- p

Now we have p point to to the new node n: *p = n
     1
   /   \
  NULL  n

And have now added n into our tree successfully.