Tải bản đầy đủ (.ppt) (102 trang)

Bài giảng cấu trúc dữ liệu bài 5 cấu trúc cây

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 (3.72 MB, 102 trang )

Tree Structure

2008

1


Nội dung






Cấu trúc cây
Cây nhị phân
Cây nhị phân tìm kiếm
Cây nhị phân tìm kiếm cân bằng AVL
Phần mở rộng (cây n-phân)



2008

Cây Top-Down
B-Tree

2


Cấu trúc dữ liệu



2008

3


Cấu trúc cây






Tập hợp các nút và cạnh nối các nút đó
Có một nút gọi là gốc
Quan hệ one-to-many giữa các nút
Có duy nhất một đường đi từ gốc đến một nút
Các loại cây:




2008

Nhị phân: mỗi nút có {0,1, 2} nút con
Tam phân: mỗi nút có {0,1,2,3} nút con
n-phân: mỗi nút có {0,1,..,n} nút con
4



Cấu trúc cây
Sao trong máy
tính, cây lại
thể hiện
ngược?

2008

5


Khái niệm
Cạnh

nút

Z
B
Q

2008

gốc

J
A
R

K


D
A

F

L



6


Khái niệm


Thuật ngữ





Nút gốc: không có nút cha
Nút lá: không có nút con
Nút trong: không phải nút con và nút gốc
Chiều cao: khoảng cách từ gốc đến lá
Nút gốc
Nút trong

Chiều cao


Nút lá
2008

7


Khái niệm
Root
Node A
Node C

Node H

Node B

Node D

Node E

Node I

Node F

Node J

Node G

Node K
Node L


Cây con
2008

Nút anh em
8


Nội dung





2008

Cấu trúc cây
Cây nhị phân
Cây nhị phân tìm kiếm
Cây nhị phân tìm kiếm cân bằng AVL

9


Binary Tree



Cấu trúc cây đơn giản nhất
Tại mỗi nút gồm các 3 thành phần








Phần data: chứa giá trị, thông tin…
Liên kết đến nút con trái (nếu có)
Liên kết đến nút con phải (nếu có)

Cây nhị phân có thể rỗng (ko có nút nào)
Cây NP khác rỗng có 1 nút gốc



2008

Có duy nhất 1 đường đi từ gốc đến 1 nút
Nút không có nút con bên trái và con bên phải là
nút lá
10


Binary Tree
Kích thước = 9 (số nút)

Mức 0

A


Cây con phải

Cây con trái
Mức 1

Mức 2

Mức 3

2008

B

D

C

E

H

F

I

G

Độ sâu/chiều cao = 3

11



Binary Tree


Cây nhị phân đúng:




Nút gốc và nút trung gian có đúng 2 con

Cây nhị phân đúng có n nút lá thì số nút trên
cây 2n-1
A
B
D

E

H
2008

C
F

I

G


J

K
12


Binary Tree


Cây nhị phân đầy đủ với chiều sâu d



Phải là cây nhị phân đúng
Tất cả nút lá có chiều sâu d

A

Số nút = (2 -1)
Số nút trung gian = ?
Biết số nút tính d của cây NP đầy đủ
d+1

B
D

2008

C
E


F

13

G


Binary Tree


Duyệt cây:



Do cây là cấu trúc ko tuyến tính
3 cách duyệt cây NP




2008

Duyệt theo thứ tự trước PreOrder: NLR
Duyệt theo thứ tự giữa InOrder: LNR
Duyệt theo thứ tự sau PostOrder: LRN

14



Binary Tree
PreOrder:
InOrder:
PostOrder:

A
B
D

E

H

2008

C
F

I

G

J

K

15


Binary Tree



Cài đặt cây NP dùng liên kết
typedef struct node
{
DataType
info;
struct node * left;
struct node * right;
} NODE;
typedef NODE * NodePtr;
NodePtr

2008

pTree;

Chứa thông tin của nút

Cấu trúc của một nút
Trỏ đến nút con phải
Trỏ đến nút con trái
Trỏ nút gốc của cây NP
16


Binary Tree
pTree
Con trỏ pTree trỏ
đến nút gốc của cây


8

5

1

3

9
2008

10

4

20

7
17


Binary Tree


Các thao tác:








NewNode, CreateNode, FreeNode, Init, IsEmpty
InsertLeft, InsertRight
DeleteLeft, DeleteRight
PreOrder, InOrder, PostOrder
Phần minh
Search
hoạ dùng
ClearTree
DataType là
kiểu int

2008

18


Binary Tree


Create
Crea Node: tạo một nút mới có giá trị là x
NodePtr CreateNode(int x)
{
NodePtr node;
node = NewNode();
node->info = x;
node->left = NULL;

node->right = NULL;
return node;
}

2008

node

new

X

19


Binary Tree


InsertLeft: thêm nút con bên trái nút p
int InsertLeft(NodePtr p, int x)
{
if (p == NULL) return FALSE;
if (p->left != NULL) return FALSE;
p->left = CreateNode(x);
return TRUE;
}

2008

20



Binary Tree


InsertRight: thêm một nút con bên phải p
int InsertRight(NodePtr p, int x)
{
if (p == NULL) return FALSE;
if (p->right != NULL) return FALSE;
p->right = CreateNode(x);
return TRUE;
}

2008

21


Binary Tree


DeleteLeft: xoá nút con bên trái của p, nút này
phải là nút lá

int DeleteLeft(NodePtr p)
{
NodePtr q;
int value;
if (p == NULL) return -1;

q = p->left;
if (q == NULL) return -1;
if (q->left != NULL || q->right !=NULL)
return -1;
value = q->info;
p->left = NULL;
FreeNode(q);
return value;
}
2008

22


Binary Tree


PreOrder: xuất theo thứ tự trước
void PreOrder(NodePtr pTree)
{
if (pTree != NULL)
{
printf(“%d ”, pTree->info);
PreOrder(pTree->left);
PreOrder(pTree->right);
}
}

2008


23


Binary Tree


InOrder
void InOrder(NodePtr pTree)
{
if (pTree != NULL)
{
InOrder(pTree->left);
printf(“%d ”, pTree->info);
InOrder(pTree->right);
}
}

2008

24


Binary Tree


PostOder
void PostOrder(NodePtr pTree)
{
if (pTree != NULL)
{

PostOrder(pTree->left);
PostOrder(pTree->right);
printf(“%d ”, pTree->info);
}
}

2008

25


×