Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
Trang: 153
BinT_Type BinT_Initialize (BinT_Type &BTree)
{ BTree = NULL;
return (BTree);
}
b. Tạo mới một nút:
Thao tác này hoàn toàn tương tự như đối với thao tác tạo mới một nút trong danh
sách liên kết đôi. Giả sử chúng ta cần tạo mới một nút có thành phần dữ liệu là
NewData.
- Thuật toán:
B1: BTNode = new BinT_OneNode
B2: IF (BTNode = NULL)
Thực hiện Bkt
B3: BTNode->BinT_Left = NULL
B4: BTNode->BinT_Right = NULL
B5: BTNode->Key = NewData
Bkt: Kết thúc
- Cài đặt thuật toán:
Hàm BinT_Create_Node có prototype:
BinT_Type BinT_Create_Node(T NewData);
Hàm tạo mới một nút có thành phần dữ liệu là NewData, hàm trả về con trỏ trỏ
tới đòa chỉ của nút mới tạo. Nếu không đủ bộ nhớ để tạo, hàm trả về con trỏ
NULL.
BinT_Type BinT_Create_Node(T NewData)
{ BinT_Type BTnode = new BinT_OneNode;
if (BTnode != NULL)
{ BTnode->BinT_Left = NULL;
BTnode->BinT_Right = NULL;
BTnode->Key = NewData;
}
return (BTnode);
}
- Minh họa thuật toán:
Giả sử chúng ta cần tạo nút có thành phần dữ liệu là 30: NewData = 30
BTnode = new BinT_OneNode
BTnode
BTnode->BinT_Left = NULL
BTnode->BinT_Right = 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 hướng dẫn phân tích khả năng vận dụng
thuật tốn có thành phần dữ liệu newdata
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
Trang: 154
BTnode->Key = NewData
BTnode
30
NULL NULL
c. Thêm một nút vào trong cây nhò phân:
Giả sử chúng ta cần thêm một nút có giá trò thành phần dữ liệu là NewData vào
trong cây nhò phân. Việc thêm có thể diễn ra ở cây con trái hoặc cây con phải của
cây nhò phân. Do vậy, ở đây chúng ta trình bày 2 thao tác thêm riêng biệt nhau:
- Thuật toán thêm 1 nút vào bên trái nhất của cây:
B1: NewNode = BinT_Create_Node (NewData)
B2: IF (NewNode = NULL)
Thực hiện Bkt
B3: IF (BinTree = NULL) // Cây rỗng
B3.1: BinTree = NewNode
B3.2: Thực hiện Bkt
B4: Lnode = BinTree
B5: IF (Lnode->BinT_Left = NULL) // Cây con trái rỗng
B5.1: Lnode->BinT_Left = NewNode
B5.2: Thực hiện Bkt
B6: Lnode = Lnode->BinT_Left // Đi theo nhánh cây con trái
B7: Lặp lại B5
Bkt: Kết thúc
- Minh họa thuật toán:
Giả sử chúng ta cần thêm nút có thành phần dữ liệu là 17 vào bên trái nhất của
cây nhò phân: NewData = 17
NewNode BinTree
17 20
NULL NULL Lnode 25 45
19 16 NULL NULL
NULL NULL 30 21
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: 155
B5.1: Lnode->BinT_Left = NewNode
NewNode BinTree
17 20
NULL NULL Lnode 25 45
19 16 NULL NULL
NULL 30 21
NULL NULL NULL NULL
Kết quả sau khi thêm:
BinTree
20
Lnode 25 45
NewNode 19 16 NULL NULL
17 NULL 30 21
NULL NULL NULL NULL NULL NULL
- Cài đặt thuật toán:
Hàm BinT_Add_Left có prototype:
BinT_Type BinT_Add_Left(BinT_Type &BT_Tree, T NewData);
Hàm thực hiện việc thêm vào bên trái nhất trong cây nhò phân BT_Tree một nút
có thành phần dữ liệu là NewData, hàm trả về con trỏ trỏ tới đòa chỉ của nút mới
thêm nếu việc thêm thành công, ngược lại nếu không đủ bộ nhớ, hàm trả về con
trỏ NULL.
BinT_Type BinT_Add_Left(BinT_Type &BT_Tree, T NewData)
{ BinT_Type NewNode = BinT_Create_Node(NewData);
if (NewNode == NULL)
return (NewNode);
if (BT_Tree == 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: 156
BT_Tree = NewNode;
else
{ BinT_Type Lnode = BT_Tree;
while (Lnode->BinT_Left != NULL)
Lnode = Lnode->BinT_Left;
Lnode->BinT_Left = NewNode;
}
return (NewNode);
}
- Thuật toán thêm 1 nút vào bên phải nhất của cây nhò phân:
B1: NewNode = BinT_Create_Node (NewData)
B2: IF (NewNode = NULL)
Thực hiện Bkt
B3: IF (BinTree = NULL) // Cây rỗng
B3.1: BinTree = NewNode
B3.2: Thực hiện Bkt
B4: Rnode = BinTree
B5: IF (Rnode->BinT_Right = NULL) // Cây con phải rỗng
B5.1: Rnode->BinT_Right = NewNode
B5.2: Thực hiện Bkt
B6: Rnode = Rnode->BinT_Right // Đi theo nhánh cây con phải
B7: Lặp lại B5
Bkt: Kết thúc
- Minh họa thuật toán:
Giả sử chúng ta cần thêm nút có thành phần dữ liệu là 21 vào bên phải nhất của
cây nhò phân: NewData = 21
BinTree NewNode
40 Rnode 21
36 55 NULL NULL
12 18 45 NULL
NULL NULL NULL NULL 10 8
NULL NULL 11 5
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: 157
B5.1: Rnode->BinT_Right = NewNode
BinTree NewNode
40 Rnode 21
36 55 NULL NULL
12 18 45 NULL
NULL NULL NULL NULL 10 8
NULL NULL 11 5
NULL NULL NULL NULL
Kết quả sau khi thêm:
BinTree
40 Rnode
36 55 NewNode
12 18 45 21
NULL NULL NULL NULL 10 8 NULL NULL
NULL NULL 11 5
NULL NULL NULL NULL
- Cài đặt thuật toán:
Hàm BinT_Add_Right có prototype:
BinT_Type BinT_Add_Right(BinT_Type &BT_Tree, T NewData);
Hàm thực hiện việc thêm vào bên phải nhất trong cây nhò phân BT_Tree một nút
có thành phần dữ liệu là NewData, hàm trả về con trỏ trỏ tới đòa chỉ của nút mới
thêm nếu việc thêm thành công, ngược lại nếu không đủ bộ nhớ, hàm trả về con
trỏ NULL.
BinT_Type BinT_Add_Right(BinT_Type &BT_Tree, T NewData)
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
.