我正在制作代码树,数据结构。但是在打印过程中出现了错误
i`m making code tree, data structure. However, there is an error in the printing process
插入过程好像没有问题,但是打印的时候只输出了根节点。问题是什么?
文本错误
- n = (节点*)m(sizeof(节点))
- 打印、扫描
数据结构,树
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.
插入过程好像没有问题,但是打印的时候只输出了根节点。问题是什么? 文本错误
- n = (节点*)m(sizeof(节点))
- 打印、扫描
数据结构,树
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.