【发布时间】:2016-04-14 20:09:58
【问题描述】:
我想从平衡 BST 中删除一个节点。我编写了以下代码,它适用于删除一个孩子,但是当我想删除一个有两个孩子的节点时,一个链接被恢复,但我失去了另一个节点。这是我的代码:
Nod* minValue(Nod *p)
{
Nod *q = p;
while (q->stg != NULL)
q = q->stg;
return q;
}
Nod* os_delete(Nod *p, int k)
{
if (p == NULL)
return p;
if (k < p->ch)
{
p->stg = os_delete(p->stg, k);
}
else if (k > p->ch)
{
p->dr = os_delete(p->dr, k);
}
else
{
p->size--;
if (p->stg = NULL)
{
Nod* aux = p->dr;
free(p);
return aux;
}
else if (p->dr == NULL)
{
Nod* aux = p->stg;
free(p);
return aux;
}
Nod* aux = minValue(p->dr);
p->ch = aux->ch;
p->dr = os_delete(p->dr, aux->ch);
}
return p;
}
例如:
9
4 15
1 7 10 18
如果我想删除键为 4 的节点,结果树将是:
9
7 15
10 18
编辑:
typedef struct nod
{
int ch, size; // ch - key of the node; size - size of node's subtree
struct nod *stg, *dr; // stg - left; dr - right
}Nod;
【问题讨论】:
-
s/childs/children/。 :-)
-
Nod结构/类是什么样的? -
我编辑了帖子。
-
除了你的预期之外,你能展示你实际得到的东西吗?
标签: c