1. Trang chủ
  2. » Công Nghệ Thông Tin

Cấu Trúc Dữ Liệu Và Giải Thuật Chapter 5 Binarytree

76 103 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 76
Dung lượng 1,27 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Cấu Trúc Dữ Liệu Và Giải Thuật Chapter 5 Binarytree Tài Liệu Bao Gồm 6 Chapter Mong các bạn theo dõi đầy đủ để đạt kết quả cao . Để Cập Nhật Thêm Tìm Hiểu Hơn Nữa Về Tài Liệu IT Thì Các Bạn Có Thể Truy Cập : https:123doc.orgtrangcanhan4336953tailieuit.htm CẢM ƠN CÁC BẠN ĐÃ THEO DÕI

Trang 1

Chương 5

Trang 2

Mục tiêu

 Giới thiệu khái niệm cấu trúc cây

 Cấu trúc dữ liệu cây nhị phân tìm kiếm: tổ chức, các thuật toán, ứng dụng

 Giới thiệu cấu trúc dữ liệu cây nhị phân tìm kiếm

Trang 3

Cấu trúc cây

Trang 4

Cấu trúc cây

Định nghĩa : cây là một tập hợp T các phần tử (gọi là

nút của cây), trong đó:

 Một nút đặc biệt được gọi là gốc,

 Các nút còn lại được chia thành những tập rời nhau T1,

T2 , , Tn theo quan hệ phân cấp trong đó Ti cũng là một cây

 Mỗi nút ở cấp i sẽ quản lý một số nút ở cấp i+1 Quan

hệ này người ta còn gọi là quan hệ cha-con

Trang 5

5

Cấu trúc cây

Trang 6

Cấu trúc cây

Trang 7

7

Khái niệm cơ bản

Bậc của một nút : là số cây con của nút đó

Bậc của một cây : là bậc lớn nhất của các nút trong cây (số cây con tối đa của một nút thuộc cây ) Cây có bậc n thì gọi

Trang 8

Khái niệm cơ bản

Độ dài đường đi từ gốc đến nút x : là số nhánh cần đi qua kể từ gốc đến x

Độ dài đường đi tổng của cây :

trong đó Px là độ dài đường đi từ gốc đến X

Độ dài đường đi trung bình : PI = PT/n (n là số nút trên cây T)

Rừng cây: là tập hợp nhiều cây trong đó thứ tự các cây

Trang 9

Khái niệm cơ bản

Trang 10

Châu âu Mỹ Các nước khác

Trang 11

11

Cấu trúc cây

Nhận xét:

 Trong cấu trúc cây không tồn tại chu trình

 Tổ chức 1 cấu trúc cây cho phép truy cập nhanh đến các phần tử của nó

Trang 12

Cây nhị phân

Trang 13

13

Cây nhị phân

Định nghĩa: Cây nhị phân là cây mà mỗi nút có tối

đa 2 cây con

Trong thực tế thường gặp các cấu trúc có dạng cây nhị phân Một cây tổng quát có thể biểu diễn thông qua cây nhị phân

Trang 14

Cây nhị phân

Cây con

trái

Cây con phải

Hình ảnh một cây nhị phân

Trang 15

15

Cây nhị phân

Figure 7.3: Binary tree structure

Trang 16

Cây nhị phân

Figure 7.4: Skewed trees

Trang 17

17

Cây nhị phân

 Cây nhị phân dùng để biểu diễn một biểu thức toán học:

Trang 18

 Đường đi (path): Tên các nút

của quá trình đi từ nút gốc theo

các cây con đến một nút nào đó

Mức

Trang 19

19

Biểu diễn cây nhị phân

Biểu diễn cây nhị phân:

 Thông tin lưu trữ tại nút

 Địa chỉ nút gốc của cây con trái trong bộ nhớ

 Địa chỉ nút gốc của cây con phải trong bộ nhớ

Trang 21

21

Duyệt cây nhị phân

Có 3 kiểu duyệt chính:

 Duyệt theo thứ tự trước (NLR)- Preorder

 Duyệt theo thứ tự giữa (LNR)- Inorder

 Duyệt theo thứ tựï sau (LRN)- Postorder

Tên của 3 kiểu duyệt này được đặt dựa trên trình tự của việc thăm nút gốc so với việc thăm 2 cây con

Trang 22

NLR (Node-Left-Right)

 Thứ tự duyệt như sau:

 Thăm nút gốc

 Thăm các nút của cây con trái

 Thăm các nút của cây con phải

Cài đặt:

if (Root != NULL ){

<Xử lý root>; //theo yêu cầu

NLR (root->left); //thăm con trái

NLR (root->right); //thăm con phải

}

Trang 24

NLR (Node-Left-Right )

Trang 25

25

LNR (Left- Node-Right)

 Thăm các nút của cây con trái

Trang 27

27

LRN (Left-Right-Node)

Thứ tự duyệt như sau:

 Thăm các nút của cây con trái

 Thăm các nút của cây con trái

Trang 30

LRN (Left-Right-Node)

 Tính toán giá trị của biểu thức dựa trên cây biểu thức

(3 + 1)3/(9 – 5 + 2) – (3(7 – 4) + 6) = –13

Trang 31

 Việc xây dựng các thao tác trên cây tổng quát phức tạp hơn trên cây nhị phân nhiều

 Chuyển cây tổng quát thành cây nhị phân

Trang 32

 Qui tắc chuyển:

 Giữ lại nút con trái nhất làm nút con trái

 Các nút con còn lại chuyển thành nút con phải

Như vậy, trong cây nhị phân mới:

 Con trái thể hiện quan hệ cha con

 Con phải thể hiện quan hệ anh em trong cây tổng quát ban đầu

Chuyển cây tổng quát về cây nhị phân

Trang 34

 Cây nhị phân tương ứng:

Trang 35

35

Cách biểu diễn cây nhị phân khác

 Có thể lưu thêm thông tin về nút cha:

typedef struct tagTNode

Trang 36

Cách biểu diễn cây nhị phân khác

Trang 37

Cây nhị phân tìm kiếm

(Binary Search Tree - BST)

Trang 38

Cây nhị phân tìm kiếm

Định nghĩa: cây nhị phân tìm kiếm (BST) là cây nhị phân trong đó thỏa mãn: Khóa của nút đang xét:

 Lớn hơn khóa của tất cả các nút thuộc cây con trái

 Nhỏ hơn khóa của tất cả các nút thuộc cây con phải

Nếu số nút trên cây là N thì chi phí tìm kiếm trung bình chỉ khoảng log2N

Trang 40

typedef struct Node

Trang 41

41

Các thao tác trên cây

1) Khởi tạo cây

2) Tạo mới 1 nút trên cây

3) Chèn 1 nút vào cây

4) Tạo cây

5) Duyệt cây

6) Tìm kiếm một nút trên cây

7) Xóa một nút khỏi cây

Trang 42

 Khởi tạo cây:

 Vào: Cây cần khởi tạo

 Ra: Cây sau khi đã đwọc khởi tạo

 Thực hiện: Cho con trỏ quản lý địa chỉ nút gốc

Trang 43

- Đặt các liên kết left, right = NULL;

Các thao tác trên cây

Trang 44

Node* CreateNode (DataType x) {

Trang 45

45

 Thêm một phần tử x vào cây:

 Việc thêm một phần tử X vào cây phải bảo đảm điều kiện ràng buộc của cây nhị phân tìm kiếm

• Có thể thêm vào nhiều chỗ khác nhau trên cây, nhưng nếu thêm vào một nút lá sẽ là tiện lợi nhất (có thể thực hiên quá trình tương tự thao tác tìm kiếm)

• Khi chấm dứt quá trình tìm kiếm cũng chính là lúc tìm được chỗ cần thêm

Các thao tác trên cây

Trang 46

46

 Chèn một nút vào cây:

 Vào : - Cây nhị phân tìm kiếm để chèn;

- Nút cần chèn p;

 Ra : Cây sau khi được chèn thêm nút p;

B1) Nếu root = NULL thì thực hiện B3;

Ngược lại, thực hiện B2;

B2) Tìm vị trí trống để chèn nút vào cây;

- Nếu root->data = p->data thì thực hiện BKT;

- Nếu p->data > root->data thì đệ quy qt chèn ở cây con phải

- Nếu p->data < root->data thì đệ quy qt chèn ở cây con trái B3 ) root  p;

BKT) Kết thúc

Các thao tác trên cây

Trang 49

49

void CreateTree (tree &root){

int n;

printf ( “n = “); scanf(“%d”,&n); for ( int i=1; i<=n;i++){

Các thao tác trên cây

 Tạo cây nhị phân tìm kiếm: Lặp lại quá trình

thêm 1 phần tử vào một cây rỗng

Trang 51

Các thao tác trên cây

Trang 52

void NLR (TREE root){

Các thao tác trên cây

 Duyệt theo thứ tự trước NLR:

 Duyệt nút gốc;

 Duyệt cây con bên trái;

Duyệt cây con bên phải;

Trang 53

53

void LNR (TREE root){

if (root!=NULL){

LNR (root->left); <Xử lý nút gốc>;

LNR (root->right); }

}

Các thao tác trên cây

 Duyệt theo thứ tự giữa LNR:

 Duyệt cây con bên trái;

 Duyệt nút gốc;

Duyệt cây con bên phải;

Trang 54

void LRN (TREE root){

if (root!=NULL){

LRN (root->left); LRN (root->right); <Xử lý nút gốc>;

}

Các thao tác trên cây

 Duyệt theo thứ tự sau LRN:

 Duyệt cây con bên trái;

Duyệt cây con bên phải;

 Duyệt nút gốc;

Trang 56

Node * SearchNode ( Tree root, DataType x){

Các thao tác trên cây

 Tìm kiếm phần tử trong cây (đệ quy):

Trang 57

Các thao tác trên cây

 Tìm kiếm phần tử trong cây (không đệ quy):

Trang 58

Tìm thấy Số node duyệt: 5 Số lần so sánh: 9

Các thao tác trên cây

Trang 59

Tìm thấy Số node duyệt: 5 Số lần so sánh: 9

Các thao tác trên cây

Trang 60

Nhận xét:

 Số lần so sánh tối đa phải thực hiện để tìm phần

tử x là h, với h là chiều cao của cây

 Như vậy thao tác tìm kiếm trên CNPTK có n nút tốn chi phí trung bình khoảng O(log2n)

Các thao tác trên cây

Trang 62

Các thao tác trên cây

Trang 64

 Hủy một phần tử có khóa x

- Trường hợp 1 : X là nút lá

 Xóa node này

Các thao tác trên cây

Trang 66

 Gán liên kết từ cha của

nó xuống con duy nhất của nó

Trang 67

Các thao tác trên cây

 Ví dụ: hủy nút có giá trị x = 37 trên cây:

 Hủy một phần tử có khóa x

- Trường hợp 1 : x là nút lá

Trang 68

 Nhận xét:

 Không thể hủy trực tiếp do x có đủ 2 con

 Hủy gián tiếp:

• Thay vì hủy x, ta sẽ tìm một phần tử thay thế y Phần tử này có tối đa một con

• Thông tin lưu tại y sẽ được chuyển lên lưu tại x

• Sau đó, nút bị hủy thật sự sẽ là Y giống như 2 trường hợp đầu

 Vấn đề: chọn Y sao cho khi lưu Y vào vị trí của

Các thao tác trên cây

 Hủy một phần tử có khóa x

- Trường hợp 3 : x có đủ 2 con

Trang 69

69

 Có 2 phần tử thỏa mãn yêu cầu:

 Phần tử nhỏ nhất (trái nhất) trên cây con phải

 Phần tử lớn nhất (phải nhất) trên cây con trái

 Việc chọn lựa phần tử nào là phần tử thay thế mạng hoàn toàn phụ thuộc vào ý thích của người lập trình

 Ở đây, ta sẽ chọn phần tử trái nhất trên cây con phải làm phân tử thay thế

Các thao tác trên cây

Trang 70

 Tìm w là nút trước nút x trên phép duyệt cây inorder (chính là nút cực phải của cây con bên trái của x)

Trang 72

void FindReplNode ( TREE &p, TREE &q)

Các thao tác trên cây

Trang 73

73

int DelNode ( TREE &root, DataType X){

if (root== NULL ) return 0;

Trang 74

void FindReplNode(Tree &p, Tree &q){

Trang 75

75

Hủy cây: Việc toàn bộ cây có thể được thực hiện

thông qua thao tác duyệt cây theo thứ tự sau:

Hủy cây con trái

Hủy cây con phải

Hủy nút gốc.

Các thao tác trên cây

void removeTree ( TREE &root){

Trang 76

Nhận xét:

 Tất cả các thao tác SearchNode, InsertNode,

DelNode đều có độ phức tạp trung bình O(h), với h

là chiều cao của cây

Các thao tác trên sẽ có độ phức tạp O(n)

Các thao tác trên cây

Ngày đăng: 11/04/2019, 17:44

TỪ KHÓA LIÊN QUAN

w