Skip to content

Commit

Permalink
Giải thích vi phạm tính chất 5 khi xóa nút
Browse files Browse the repository at this point in the history
  • Loading branch information
bangoc committed Dec 31, 2023
1 parent e071173 commit 6f460bb
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions cont/tmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,9 @@ static struct tname *prefix##delete(struct tname *t, struct TNN(tname) *dn) { \
TPAINT_BLACK(child); \
rebalance = NULL; \
} else { \
/* Cả 2 con của node đều là NULL => Vị trí cũ của node
* được thay bằng con trỏ NULL. Nếu node là nút đen thì
* độ cao đen của đường đi qua node giảm 1 => vi phạm tính chất 5. */ \
rebalance = TIS_BLACK(node)? node->top: NULL; \
} \
} else if (!child) { \
Expand Down Expand Up @@ -522,9 +525,9 @@ static struct tname *prefix##delete(struct tname *t, struct TNN(tname) *dn) { \
* / /
* (p) (p)
* / /
* (s) (c)
* (s) (c2)
* \
* (c)
* (c2)
*/ \
do { \
successor = tmp; \
Expand All @@ -544,15 +547,22 @@ static struct tname *prefix##delete(struct tname *t, struct TNN(tname) *dn) { \
successor->left = tmp; \
tmp->top = successor; \
if (child2) { \
/* child2 phải là nút đỏ và top của nó phải là nút đen do top của nó
* không có con trái */ \
TPAINT_BLACK(child2); \
rebalance = NULL; \
} else {\
/* child2 == NULL => Vị trí cũ của successor được thay bằng NULL,
* Nếu successor là nút đen thì độ cao đen của đường đi qua child2
* bị giảm 1 => vi phạm tính chất 5 */ \
rebalance = TIS_BLACK(successor) ? top: NULL; \
}\
prefix##change(node, successor, t); \
TPAINT(successor, node->color); \
} \
if (rebalance) { \
/* Nút rebalance có 1 con NULL sao cho đường đi qua đó
* ngắn hơn 1 so với các đường đi khác */ \
prefix##delete_fixup(t, rebalance); \
} \
free(dn); \
Expand Down

0 comments on commit 6f460bb

Please sign in to comment.