Tải bản đầy đủ (.pdf) (5 trang)

Giáo trình phân tích quy trình ứng dụng thuật toán có thành phần dữ liệu newdata p6 doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (133.09 KB, 5 trang )

Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
Trang: 178
Tiến hành các bước để hủy DelNode:
B3: PrDelNode->BST_Left = DelNode->BST_Left
B4: DelNode->BST_Left = NULL
PrDelNode BSTree

DelNode 60

MRNode 25 65

19 NULL NULL 40 NULL NULL

10 30 44

NULL NULL NULL NULL NULL NULL
Kết quả sau khi hủy:
PrDelNode BSTree

MRNode 60

19 65

10 40 NULL NULL

NULL NULL 30 44

NULL NULL NULL NULL
- Sử dụng phần tử thế mạng (standby):
Theo phương pháp này chúng ta sẽ không hủy nút có đòa chỉ DelNode mà chúng ta
sẽ hủy nút có đòa chỉ của phần tử thế mạng là nút phải nhất trong cây con trái của


DelNode (MRNode), hoặc là nút trái nhất trong cây con phải của DelNode (MLNode).
Sau khi chuyển toàn bộ nội dung dữ liệu của nút thế mạng cho DelNode
(DelNodeKey = MRNode->Key hoặc DelNode->Key = MLNode->Key) thì chúng ta
sẽ hủy nút thế mạng như đối với trường hợp c
1
) và c
2
) ở trên.
Ví dụ:
Giả sử cần hủy nút có Key = 25 (DelData = 25). Chúng ta sẽ chọn phần tử thế
mạng MLNode là nút trái nhất trong cây con phải của DelNode (trái nhất trong
DelNode->BST_Right) để hủy,
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e

V
i
e
w
e

r
w
w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g

e

V
i
e
w
e
r
w
w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m
.
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
Trang: 179
BSTree


DelNode 60

25 PrMLNode 65

19 MLNode 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL NULL NULL
Chuyển dữ liệu trong MLNode về cho DelNode: DelNode->Key = MLNode->Key
BSTree

DelNode 60

30 PrMLNode 65

19 MLNode 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL NULL NULL
Tiến hành hủy MLNode (hủy nút lá): PrMLNode->BST_Left = NULL
BSTree

DelNode 60

30 PrMLNode 65

19 MLNode 40 NULL NULL


10 NULL 30 NULL 44

NULL NULL NULL NULL NULL NULL
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e

V
i
e
w
e
r
w
w
w
.
d
o
c

u
-
t
r
a
c
k
.
c
o
m
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e

V
i
e
w
e
r

w
w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m
.
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
Trang: 180
Kết quả sau khi hủy:
BSTree

DelNode 60

30 PrMLNode 65

19 40 NULL NULL


10 NULL NULL 44

NULL NULL NULL NULL
- Thuật toán hủy 1 nút trong cây nhò phân tìm kiếm bằng phương pháp chuyển cây
con phải của nút cần hủy về thành cây con phải của cây con có nút gốc là nút
phải nhất trong cây con trái của nút cần hủy (nếu nút cần hủy có đủ 02 cây con):
// Tìm nút cần hủy và nút cha của nút cần hủy
B1: DelNode = BSTree
B2: PrDelNode = NULL
B3: IF (DelNode = NULL)
Thực hiện Bkt
B4: IF (DelNode->Key = DelData)
Thực hiện B8
B5: IF (DelNode->Key > DelData) // Chuyển sang cây con trái
B5.1: PrDelNode = DelNode
B5.2: DelNode = DelNode->BST_Left
B5.3: OnTheLeft = True
B5.4: Thực hiện B7
B6: IF (DelNode->Key < DelData) // Chuyển sang cây con phải
B6.1: PrDelNode = DelNode
B6.2: DelNode = DelNode->BST_Right
B6.3: OnTheLeft = False
B6.4: Thực hiện B7
B7: Lặp lại B3
// Chuyển các mối quan hệ của DelNode cho các nút khác
B8: IF (PrDelNode = NULL) // DelNode là nút gốc
// Nếu DelNode là nút lá
B8.1: If (DelNode->BST_Left = NULL) and (DelNode->BST_Right = NULL)
B8.1.1: BSTree = NULL
B8.1.2: Thực hiện B10

// Nếu DelNode có một cây con phải
B8.2: If (DelNode->BST_Left = NULL) and (DelNode->BST_Right != NULL)
B8.2.1: BSTree = BSTree->BST_Right
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e

V
i
e
w
e
r
w
w
w
.
d
o
c
u

-
t
r
a
c
k
.
c
o
m
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e

V
i
e
w
e
r
w

w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m
.
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
Trang: 181
B8.2.2: DelNode->BST_Right = NULL
B8.2.3: Thực hiện B10
// Nếu DelNode có một cây con trái
B8.3: If (DelNode->BST_Left != NULL) and (DelNode->BST_Right = NULL)
B8.3.1: BSTree = BSTree->BST_Left
B8.3.2: DelNode->BST_Left = NULL
B8.3.3: Thực hiện B10
// Nếu DelNode có hai cây con
B8.4: If (DelNode->BST_Left != NULL) and (DelNode->BST_Right != NULL)
// Tìm nút phải nhất trong cây con trái của DelNode

B8.4.1: MRNode = DelNode->BST_Left
B8.4.2: if (MRNode->BST_Right = NULL)
Thực hiện B8.4.5
B8.4.3: MRNode = MRNode->BST_Right
B8.4.4: Lặp lại B8.4.2
// Chuyển cây con phải của DelNode về cây con phải của MRNode
B8.4.5: MRNode->BST_Right = DelNode->BST_Right
B8.4.6: DelNode->BST_Right = NULL
// Chuyển cây con trái còn lại của DelNode về cho BSTree
B8.4.7: BSTree = BSTree->BST_Left
B8.4.8: DelNode->BST_Left = NULL
B8.4.9: Thực hiện B10
B9: ELSE // DelNode không phải là nút gốc
// Nếu DelNode là nút lá
B9.1: If (DelNode->BST_Left = NULL) and (DelNode->BST_Right = NULL)
// DelNode là cây con trái của PrDelNode
B9.1.1: if (OnTheLeft = True)
PrDelNode->BST_Left = NULL
B9.1.2: else // DelNode là cây con phải của PrDelNode
PrDelNode->BST_Right = NULL
B9.1.3: Thực hiện B10
// Nếu DelNode có một cây con phải
B9.2: If (DelNode->BST_Left = NULL) and (DelNode->BST_Right != NULL)
B9.2.1: if (OnTheLeft = True)
PrDelNode->BST_Left = DelNode->BST_Right
B9.2.2: else
PrDelNode->BST_Right = DelNode->BST_Right
B9.2.3: DelNode->BST_Right = NULL
B9.2.4: Thực hiện B10
// Nếu DelNode có một cây con trái

B9.3: If (DelNode->BST_Left != NULL) and (DelNode->BST_Right = NULL)
B9.3.1: if (OnTheLeft = True)
PrDelNode->BST_Left = DelNode->BST_Left
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e

V
i
e
w
e
r
w
w
w
.
d
o
c
u

-
t
r
a
c
k
.
c
o
m
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e

V
i
e
w
e
r
w

w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m
.
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
Trang: 182
B9.3.2: else
PrDelNode->BST_Right = DelNode->BST_Left
B9.3.3: DelNode->BST_Left = NULL
B9.3.4: Thực hiện B10
// Nếu DelNode có hai cây con
B9.4: If (DelNode->BST_Left != NULL) and (DelNode->BST_Right != NULL)
// Tìm nút phải nhất trong cây con trái của DelNode
B9.4.1: MRNode = DelNode->BST_Left
B9.4.2: if (MRNode->BST_Right = NULL)
Thực hiện B9.4.5

B9.4.3: MRNode = MRNode->BST_Right
B9.4.4: Lặp lại B9.4.2
// Chuyển cây con phải DelNode về thành cây con phải MRNode
B9.4.5: MRNode->BST_Right = DelNode->BST_Right
B9.4.6: DelNode->BST_Right = NULL
// Chuyển cây con trái còn lại của DelNode về cho PrDelNode
B9.4.7: if (OnTheLeft = True)
PrDelNode->BST_Left = DelNode->BST_Left
B9.4.8: else
PrDelNode->BST_Right = DelNode->BST_Left
B9.4.9: DelNode->BST_Left = NULL
B9.4.10: Thực hiện B10
// Hủy DelNode
B10: delete DelNode
Bkt: Kết thúc
- Cài đặt thuật toán:
Hàm BST_Delete_Node_TRS có prototype:
int BST_Delete_Node_TRS(BST_Type &BS_Tree, T DelData);
Hàm thực hiện việc hủy nút có thành phần Key là DelData trên cây nhò phân tìm
kiếm BS_Tree bằng phương pháp chuyển cây con phải của nút cần hủy về thành
cây con phải của cây có nút gốc là nút phải nhất trong cây con trái của nút cần
hủy (nếu nút cần hủy có hai cây con). Hàm trả về giá trò 1 nếu việc hủy thành
công (có nút để hủy), trong trường hợp ngược lại hàm trả về giá trò 0 (không tồn
tại nút có Key là DelData hoặc cây rỗng).
int BST_Delete_Node_TRS(BST_Type &BS_Tree, T DelData)
{ BST_Type DelNode = BS_Tree;
BST_Type PrDelNode = NULL;
int OnTheLeft = 0;
while (DelNode != NULL)
{ if (DelNode->Key == DelData)

break;
PrDelNode = DelNode;
if (DelNode->Key > DelData)
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e

V
i
e
w
e
r
w
w
w
.
d
o
c
u

-
t
r
a
c
k
.
c
o
m
Click to buy NOW!
P
D
F
-
X
C
h
a
n
g
e

V
i
e
w
e
r
w

w
w
.
d
o
c
u
-
t
r
a
c
k
.
c
o
m
.

×