CÂY NHỊ PHÂN
NHÓM 4
NỘI DUNG
•
Khái niệm
•
Đặc điểm
•
Kiểu dữ liệu
•
Cấu trúc chương trình
•
Các thao tác
CÂY
• Là tập hợp hữu hạn các
nút, trong đó có 1 nút đặc
biệt là gốc
• Giữa các nút có quan hệ
phân cấp “cha-con”
KHÁI NIỆM
2
2
0
2
1
0
1
• Bậc của một nút: là số cây
con của nút đó
• Nút gốc: là nút không có nút
cha
• Nút lá: là nút có bậc bằng 0
0
0
• Nút nhánh: là nút có bậc
khác 0 và không phải là gốc
KHÁI NIỆM
Mức 1
Mức 2
Mức 3
Mức 4
• Mức của cây: người
ta quy ước nút gốc có
mức là 1, nếu nút cha
có mức i thì nút con
có mức i+1.
• Độ cao của cây:là
mức cao nhất của các
nút trong cây
CÂY NHỊ PHÂN
• Mọi nút trên cây nhị phân
chỉ có tối đa hai cây con.
• Đối với cây con của một
nút người ta cũng phân
biệt cây con trái và cây
con phải
CÂY NHỊ PHÂN TÌM KIẾM
• Là cây nhị phân
7
3
1
• Giá trị của một node bất kỳ
luôn lớn hơn giá trị của tất
cả các node bên trái và nhỏ
hơn giá trị tất cả các node
bên phải
36
6
15
48
Nút có giá trị nhỏ nhất nằm
ở trái nhất của cây
Nút có giá trị lớn nhất nằm ở
phải nhất của cây
KIỂU DỮ LIỆU
Nút
Giá trị
Trỏ trái
TNODE
Trỏ phải
typedef struct TNode
{
<Data> Key;
struct TNode *pLeft, *pRight;
} *TREE;
pLeft
Key
pRight
Ví dụ
typedef struct TNode
{
int Key;
struct TNode *pLeft, *pRight;
} *TREE;
CẤU TRÚC CHƯƠNG TRÌNH
begin
Khai báo cấu trúc cây
Khởi tạo cây rỗng
Xây dựng cây
Các thao tác
Hủy cây
end
CÁC THAO TÁC
1. Tạo cây
2. Duyệt cây
3. Cho biết các thông tin của cây
4. Tìm kiếm
5. Xoá node trên cây
TẠO CÂY
7
36
317466
40
15
3
1
6
4
15
40
Nếu node cần thêm
nhỏ hơn node đang
xét thì thêm về bên
trái
Ngược lại thì thêm
về bên phải
12
HÀM TẠO CÂY
int ThemNut (TREE & t, int x)
{
if(t!=NULL)
{
if(x==t->Key)
return 0;
else
{
if(x<t->Key) ThemNut(t->pLeft, x);
else
ThemNut(t->pRight, x);
}
}
else
{
t=new TNODE;
if(t==NULL)
return -1;
t->Key=x;
t->pLeft=t->pRight=NULL;
return 1;
}
}
CÁC THAO TÁC
1. Tạo cây
2. Duyệt cây
3. Cho biết các thông tin của cây
4. Tìm kiếm
5. Xoá node trên cây
DUYỆT CÂY
Thứ tự trước (NLR)
Thứ tự giữa
(LNR)
Thứ tự sau
(LRN)
DUYÊT TRƯỚC (NLR)
Tại node t đang xét, nếu
khác rỗng thì
• In giá trị của t
• Duyệt cây con bên trái
của t theo thứ tự NLR
• Duyệt cây con bên phải
của t theo thứ tự NLR
void NLR (TREE t)
{
if(t!=NULL)
{
frintf(“%d”, T->key);
NLR(t->pLeft);
NLR(t->pRight);
}
}
MINH HỌA
7
3
36
1
6
4
15
40
23
Kết quả 7, 3, 1, 6, 4, 36, 15, 23, 40
DUYỆT GIỮA (LNR)
Tại node t đang xét, nếu
khác rỗng thì
void LNR (TREE t)
• Duyệt cây con bên trái
của t theo thứ tự LNR
if(t!=NULL)
{
{
LNR(t->pLeft);
• In giá trị của t
printf(“%d,T->key”);
• Duyệt cây con bên phải
của t theo thứ tự LNR
LNR(t->pRight);
}
}
MINH HỌA
7
3
36
1
6
4
15
40
23
Kết quả 1, 3, 4, 6, 7, 15, 23, 36, 40
DUYỆT SAU (LRN)
Tại node t đang xét, nếu
khác rỗng thì
void LRN (TREE t)
{
if(t!=NULL)
• Duyệt cây con bên trái
của t theo thứ tự LRN
{
LRN(t->pLeft);
• Duyệt cây con bên phải
của t theo thứ tự LRN
LRN(t->pRight);
cout<<t->Key<<“ “;
• In giá trị của t
}
}
MINH HỌA
7
3
36
1
6
4
15
40
23
Kết quả 1, ,4, 6, 3, 23, 15, 40, 36, 7
CÁC THAO TÁC
1. Tạo cây
2. Duyệt cây
3. Cho biết các thông tin của cây
4. Tìm kiếm
5. Xoá node trên cây
XÓA NODE
7
3
36
1
6
4
15
40
23
1.
Node lá
2.
Node có 1 cây con
3.
Node có 2 cây con
XÓA NODE LÁ
7
3
36
1
6
4
15
Xóa 1
40
23
Xóa 23
XÓA NODE CÓ 1 CÂY CON
7
3
Xóa 6
36
1
46
4
23
15
40
23
Xóa 15