Tải bản đầy đủ (.pptx) (27 trang)

Cấu trúc dữ liệu và giải thuật, cây nhị phân

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 (1.48 MB, 27 trang )

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


×