我想从平衡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;
[二进制搜索树中的删除]可能有重复(http://stackoverflow.com/questions/7606185/deletion-in-binary-search-tree) – EOF
s/childs/children /。 :-) –
'Nod'结构/类是什么样的? –