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

CẤU TRÚC DỮ LIỆU CÂY (TREE) pot

34 652 4
Tài liệu đã được kiểm tra trùng lặp

Đ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 34
Dung lượng 1,11 MB

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

Nội dung

Hơn nữa các nút con của cây được phân biệt thứ tự rõ ràng, một nút con gọi là nút con trái và một nút con gọi là nút con phải.. CÂY TÌM KIẾM NHỊ PHÂNCây tìm kiếm nhị phân TKNP là cây n

Trang 1

CẤU TRÚC DỮ LIỆU CÂY

(TREE)

Thạc sĩ: HUỲNH PHƯỚC DANH Email: danhhp@sonadezi.edu.vn

Trang 2

KHÁI NIỆM CÂY

Cây là một tập hợp các phần tử (các nút) được tổ chức và có các đặc điểm sau:

 Hoặc là một tập hợp rỗng (cây rỗng).

 Hoặc là một tập hợp khác rỗng trong đó có một nút duy nhất được làm nút gốc (Root’s Node), các nút còn lại được phân thành các nhóm trong đó mỗi nhóm lại là một cây gọi là cây con (Sub-Tree).

Như vậy, một cây con có thể là một tập rỗng các nút và cũng có thể là một tập hợp khác rỗng trong đó có một nút làm nút gốc cây con.

Trang 3

CÁC KHÁI NIỆM

 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

 Nút nhánh: là nút có bậc khác 0 và không phải là gốc

2

2 2

1 1

0

0

0

0

Trang 4

từ gốc đến x

 Độ cao của cây: Độ dài đường đi từ gốc đến nút lá ở mức thấp nhất.

Trang 5

CÂY NHỊ PHÂN

Cây nhị phân là cây rỗng hoặc là cây mà mỗi nút có tối đa hai

nút con (cây có bậc bằng 2) Hơn nữa các nút con của cây

được phân biệt thứ tự rõ ràng, một nút con gọi là nút con trái

và một nút con gọi là nút con phải Ta qui ước vẽ nút con trái bên trái nút cha và nút con phải bên phải nút cha, mỗi nút con được nối với nút cha của nó bởi một đoạn thẳng.

Trang 7

CẤU TRÚC DỮ LIỆU CÂY NHỊ PHÂN

struct BinT_Node

{

<Kiểu dữ liệu> info;

BinT_Node *left; // Vùng liên kết quản

lý địa chỉ nút gốc cây con trái

BinT_Node *right; // Vùng liên kết quản

lý địa chỉ nút gốc cây con phải

};

Info

BinT_Node

Trang 8

DUYỆTCÂY NHỊ PHÂN

 Duyệt theo thứ tự nút gốc trước (Preorder):

Theo cách duyệt này thì nút gốc sẽ được duyệt trước, sau

đó mới duyệt đến hai cây con Căn cứ vào thứ tự duyệt hai cây con mà chúng ta có hai cách duyệt theo thứ tự nút gốc trước:

Duyệt nút gốc, duyệt cây con trái, duyệt cây con phải

(Root – Left – Right)

Duyệt nút gốc, duyệt cây con phải, duyệt cây con trái

(Root – Right – Left)

Trang 10

DUYỆTCÂY NHỊ PHÂN

 Duyệt theo thứ tự nút gốc giữa (Inorder):

Theo cách duyệt này thì chúng ta duyệt một trong hai cây

con trước rồi đến duyệt nút gốc và sau đó mới duyệt cây

con còn lại Căn cứ vào thứ tự duyệt hai cây con chúng ta

cũng sẽ có hai cách duyệt theo thứ tự nút gốc giữa:

 Duyệt cây con trái, duyệt nút gốc, duyệt cây con phải (Left – Root – Right)

 Duyệt cây con phải, duyệt nút gốc, duyệt cây con trái (Right – Root – Left)

Trang 12

DUYỆTCÂY NHỊ PHÂN

 Duyệt theo thứ tự nút gốc sau (Postorder):

Tương tự như duyệt theo nút gốc trước, trong cách duyệt

này thì nút gốc sẽ được duyệt sau cùng so với duyệt hai nút

gốc cây con Do vậy, căn cứ vào thứ tự duyệt hai cây con mà chúng ta cũng có hai cách duyệt theo thứ tự nút gốc sau:

Duyệt cây con trái, duyệt cây con phải, duyệt nút gốc (Left – Right – Root)

Duyệt cây con phải, duyệt cây con trái, duyệt nút gốc (Right – Left – Root)

Trang 14

CÂY TÌM KIẾM NHỊ PHÂN

Cây tìm kiếm nhị phân (TKNP) là cây nhị phân mà khoá tại mỗi nút cây lớn hơn khoá của tất cả các nút thuộc cây con bên trái và nhỏ hơn khoá của tất cả các nút thuộc cây con bên phải

Lưu ý: Dữ liệu lưu trữ tại mỗi nút có thể rất phức tạp như là

một record chẳng hạn, trong trường hợp này khoá của nút được tính dựa trên một trường nào đó, ta gọi là trường khoá Trường khoá phải chứa các giá trị có thể so sánh được, tức là

nó phải lấy giá trị từ một tập hợp có thứ tự

Trang 15

CÂY TÌM KIẾM NHỊ PHÂN

Ví dụ: hình minh hoạ một cây TKNP có khoá là số nguyên (với

quan hệ thứ tự trong tập số nguyên)

Trang 16

CÂY TÌM KIẾM NHỊ PHÂN

Qui ước: Cũng như tất cả các cấu trúc khác, ta coi cây rỗng là

cây TKNP

Nhận xét:

 Trên cây TKNP không có hai nút cùng khoá

 Cây con của một cây TKNP là cây TKNP

 Khi duyệt trung tự (InOrder) cây TKNP ta được một dãy

có thứ tự tăng Chẳng hạn duyệt duyệt cây con phải (Left – Root - Right) cây trên ta có dãy: 5, 10, 15, 17, 20, 22, 30, 35, 42.

Trang 17

CÂY TÌM KIẾM NHỊ PHÂN

Cài đặt cây tìm kiếm nhị phân Cây TKNP, trước hết, là một cây nhị phân Do đó ta có thể áp dụng các cách cài đặt như

đã trình bày trong phần cây nhị phân Sẽ không có sự khác biệt nào trong việc cài đặt cấu trúc dữ liệu cho cây TKNP so với cây nhị phân, nhưng tất nhiên, sẽ có sự khác biệt trong các giải thuật thao tác trên cây TKNP như tìm kiếm, thêm hoặc xoá một nút trên cây TKNP để luôn đảm bảo tính chất cuả cây TKNP.

Tổ chức dữ liệu và khởi tạo

Trang 18

CÂY TÌM KIẾM NHỊ PHÂN

Tổ chức dữ liệu và khởi tạo

// Khai báo bi n root qu n lý cây nhi phan: ế ả

BinT_Node* Root;

//Kh i t o cây nhi phan:  ở ạ

Root = NULL;

struct BinT_Node

{ <Kiểu dữ liệu> info;

BinT_Node *Left; // Vùng liên kết quản lý địa chỉ nút gốc cây con trái

BinT_Node *Right; // Vùng liên kết quản lý địa chỉ nút gốc cây con phải

};

Trang 19

CÂY TÌM KIẾM NHỊ PHÂN

Tìm kiếm một nút có khóa cho trước trên cây TKNP

Để tìm kiếm 1 nút có khoá x trên cây TKNP, ta tiến hành từ nút gốc bằng cách so sánh khoá của nút gốc với khoá x

 Nếu nút gốc bằng NULL thì không có khoá x trên cây

 Nếu x bằng khoá của nút gốc thì giải thuật dừng và ta đã tìm được nút chứa khoá x

 Nếu x lớn hơn khoá của nút gốc thì ta tiến hành (một cách đệ qui) việc tìm khoá x trên cây con bên phải

 Nếu x nhỏ hơn khoá của nút gốc thì ta tiến hành (một cách đệ qui) việc tìm khoá x trên cây con bên trái

Trang 20

CÂY TÌM KIẾM NHỊ PHÂN

Ví dụ: tìm nút có khoá 30 trong cây ở bên

So sánh 30 với khoá nút gốc là 20, vì 30 >

20 vậy ta tìm tiếp trên cây con bên phải, tức

là cây có nút gốc có khoá là 35

So sánh 30 với khoá của nút gốc là 35, vì

30 < 35 vậy ta tìm tiếp trên cây con bên trái,

tức là cây có nút gốc có khoá là 22

So sánh 30 với khoá của nút gốc là 22, vì

30 > 22 vậy ta tìm tiếp trên cây con bên phải,

Trang 21

CÂY TÌM KIẾM NHỊ PHÂN

BinT_Node* TreeSearch(int x, BinT_Node* Root)

Hàm dưới đây trả về kết quả là con trỏ trỏ tới nút chứa khoá

x hoặc NULL nếu không tìm thấy khoá x trên cây TKNP

Tìm kiếm một nút có khóa cho trước trên cây TKNP

Trang 22

CÂY TÌM KIẾM NHỊ PHÂN

Thêm một nút có khóa cho trước vào cây TKNP

Theo định nghĩa cây tìm kiếm nhị phân ta thấy trên cây tìm

kiếm nhị phân không có hai nút có cùng một khoá Do đó nếu

ta muốn thêm một nút có khoá x vào cây TKNP thì trước hết

ta phải tìm kiếm để xác định có nút nào chứa khoá x chưa

Nếu có thì giải thuật kết thúc (không làm gì cả!) Ngược lại, sẽ

thêm một nút mới chứa khoá x này

Việc thêm một khoá vào cây TKNP là việc tìm kiếm và thêm

một nút, tất nhiên, phải đảm bảo cấu trúc cây TKNP không bị

phá vỡ Giải thuật cụ thể như sau:

Trang 23

CÂY TÌM KIẾM NHỊ PHÂN

Thêm một nút có khóa cho trước vào cây TKNP

Ta tiến hành từ nút gốc bằng cách so sánh khóa cuả nút gốc

với khoá x

Nếu nút gốc bằng NULL thì khoá x chưa có trên cây, do

đó ta thêm một nút mới chứa khoá x

Nếu x bằng khoá của nút gốc thì giải thuật dừng, trường

hợp này ta không thêm nút.

Nếu x lớn hơn khoá của nút gốc thì ta tiến hành (một

cách đệ qui) giải thuật này trên cây con bên phải.

Nếu x nhỏ hơn khoá của nút gốc thì ta tiến hành (một

cách đệ qui) giải thuật này trên cây con bên trái

Trang 24

CÂY TÌM KIẾM NHỊ PHÂN

Thêm một nút có khóa cho trước vào cây TKNP

Ví dụ: thêm khoá 19 vào cây

 So sánh 19 với khoá của nút gốc là 20, vì 19 < 20

vậy ta xét tiếp đến cây bên trái, tức là cây có nút

gốc có khoá là10.

 So sánh 19 với khoá của nút gốc là 10, vì 19 > 10

vậy ta xét tiếp đến cây bên phải, tức là cây có nút

gốc có khoá là 17

 So sánh 19 với khoá của nút gốc là 17, vì 19 > 17

vậy ta xét tiếp đến cây bên phải Nút con bên phải

bằng NULL, chứng tỏ rằng khoá 19 chưa có trên

cây, ta thêm nút mới chứa khoá 19 và nút mới này

là con bên phải của nút có khoá là 17

Trang 25

CÂY TÌM KIẾM NHỊ PHÂN

Thêm một nút có khóa cho trước vào cây TKNP

Thủ tục sau đây tiến hành việc thêm một khoá vào cây TKNP

void InsertNode(int x, BinT_Node* &Root )

Trang 26

CÂY TÌM KIẾM NHỊ PHÂN

Xóa một nút có khóa cho trước ra khỏi cây TKNP

Giả sử ta muốn xoá một nút có khoá x, trước hết ta phải tìm kiếm nút chứa khoá x trên cây

Trang 27

CÂY TÌM KIẾM NHỊ PHÂN

Xóa một nút có khóa cho trước ra khỏi cây TKNP

Việc xoá một nút như vậy, tất nhiên, ta phải bảo đảm cấu trúc cây TKNP không bị phá vỡ Ta có các trường hợp như sau:

Ví dụ về giải thuật xóa nút trên cây

 Nếu không tìm thấy nút chứa khoá x thì giải thuật kết thúc

 Nếu tìm gặp nút N có chứa khoá x, ta có ba trường hợp sau

 Nếu N là lá ta thay nó bởi NULL

 N chỉ có một nút con ta thay nó bởi nút con của nó

Trang 28

CÂY TÌM KIẾM NHỊ PHÂN

Xóa một nút có khóa cho trước ra khỏi cây TKNP

Việc xoá một nút như vậy, tất nhiên, ta phải bảo đảm cấu trúc cây TKNP không bị phá vỡ Ta có các trường hợp như sau:

Ví dụ về giải thuật xóa nút trên cây

N có hai nút con ta thay nó bởi nút lớn nhất trên cây con trái của

nó (nút cực phải của cây con trái) hoặc là nút bé nhất trên cây con phải của nó (nút cực trái của cây con phải) Trong giải thuật sau,

ta thay x bởi khoá của nút cực trái của cây con bên phải rồi ta xoá nút cực trái này Việc xoá nút cực trái của cây con bên phải sẽ rơi vào một trong hai trường hợp trên

Trang 29

CÂY TÌM KIẾM NHỊ PHÂN

Xóa một nút có khóa cho trước ra khỏi cây TKNP

Hàm dưới đây trả về khoá của nút cực trái, đồng thời xoá nút này

int DeleteMin (BinT_Node* &Root )

Trang 30

CÂY TÌM KIẾM NHỊ PHÂN

void DeleteNode(int x, BinT_Node* &Root)

else

if (Root->right==NULL) Root = Root->left;

 Thủ tục xóa một nút có khoá cho trước trên cây TKNP

Trang 31

BÀI TẬP

1 Hãy xây dựng cây nhị phân tìm kiếm theo thứ tự nhập sau:

Hãy duyệt cây trên theo thứ tự trước

2.Hãy xây dựng cây nhị phân tìm kiếm theo thứ tự nhập sau:

Hãy duyệt cây trên theo thứ tự trước

3 Hãy xây dựng cây nhị phân tìm kiếm theo thứ tự nhập sau:

Huế Đà Nẵng Hà Nội Vĩnh Long Cần Thơ Sóc Trăng Nha Trang Đồng Nai Vũng Tàu An Giang Tiền Giang

Trang 33

BÀI TẬP

Bài 5

cây T theo thứ tự Left-Right-Node thì được dãy sau: 1, 4, 7, 5, 3, 16, 18, 15, 29, 25, 30, 20, 8.

từ gốc có độ dài là 4 trên cây

Trang 34

BÀI TẬP

Bài 6

duyệt cây T theo thứ tự Node-Left-Right thì được dãy sau: 9, 4, 1, 3, 8, 6, 5, 7, 10, 14, 12, 13, 16, 19.

của cây.

Ngày đăng: 09/07/2014, 00:21

TỪ KHÓA LIÊN QUAN

w