我想從平衡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'結構/類是什麼樣的? –