1. Trang chủ
  2. » Luận Văn - Báo Cáo

Cấu trúc dữ liệu và giải thuật đề tài khái niệm và định nghĩa cây nhị phân

24 1 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

Tiêu đề Khái niệm và định nghĩa cây nhị phân
Tác giả Nguyễn Phước Thịnh, Nguyễn Duy Trường, Ngô Thành Hữu
Người hướng dẫn Đinh Thị Hồng Loan
Trường học Trường Đại học Tài nguyên và Môi trường TP.HCM
Chuyên ngành Cấu trúc dữ liệu và giải thuật
Thể loại Đề tài
Năm xuất bản 2024
Thành phố TP Hồ Chí Minh
Định dạng
Số trang 24
Dung lượng 1,1 MB

Nội dung

Duyệt cây nhị phânCó 3 cách duyệt cây nhị phân: Duyệt tiền tự NLR: duyệt nút gốc, duyệt tiền tự cây con trái, duyệt tiền tự cây con phải. Duyệt trung tự LNR: duyệt trung tự cây con trá

Trang 1

TRƯỜNG ĐẠI HỌC TÀI NGUYÊN VÀ MÔI TRƯỜNG TP.HCM KHOA: HỆ THỐNG THÔNG TIN VÀ VIỄN THÁM

-

-MÔN: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Đề tài: Khái niệm và định nghĩa cây nhị phân

Giáo viên hướng

Ngô Thành 1150070015

Thịnh-Thuyết trình + PowerPoint

Nguyễn Duy Trường-Tiểu luận + PowerPoint Ngô Thành Hữu-Thuyết

Trang 2

trình + Tiểu Luận

TP Hồ Chí Minh, tháng 2 năm 2024

Trang 3

MỤC LỤC

PHẦN MỞ ĐẦU 1

PHẦN NỘI DUNG 2

I CẤU TRÚC CÂY 2

II CÂY NHỊ PHÂN 2

1 Các khái niệm 3

2 Định nghĩa cấu trúc nút 3

3 Định nghĩa cấu trúc cây 4

4 Duyệt cây nhị phân 5

4.1 Duyệt tiền tự 5

4.2 Duyệt trung tự 6

4.3 Duyệt hậu tự 6

5 Hủy cây nhị phân 6

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

1 Thêm phần tử vào cây nhị phân tìm kiếm 8

2 Tìm một phần tử trong cây nhị phân tìm kiếm 8

3 Hủy nút trên cây nhị phân tìm kiếm 9

3.1 Trường hợp 1 10

3.2 Trường hợp 2 10

IV SOURCE CODE 12

PHẦN TỔNG KẾT 19

TÀI LIỆU THAM KHẢO 19

Trang 4

PHẦN MỞ ĐẦU

Cây nhị phân là một cấu trúc dữ liệu cơ bản và phổ biến trong khoa học máy tính Nó được sử dụng để lưu trữ và tổ chức dữ liệu một cách hiệu quả, giúp việc truy cập và xử lý dữ liệu trở nên đơn giản và nhanh chóng hơn

Trang 5

PHẦN NỘI DUNG

I CẤU TRÚC CÂY

Cấu trúc cây (Tree) là một tập hợp các phần tử gọi là nút (node),mỗi cây có một nút gốc (root) chứa nhiều nút con, mỗi nút con lại là một tập hợp các nút khác gọi là cây con (subtree)

Các khái niệm cơ bản về cây:

 Bậc của nút: là số nút con của nút đó Ví dụ bậc của nút A là

3, bậc của nút C là 1, bậc của nút G là 0…

 Bậc của cây: là bậc lớn nhất của nút trong cây đó, cây bậc n

sẽ được gọi là cây n – phân Ví dụ cây trong hình trên có bậc

3, gọi là cây tam phân, cây có bậc 2 gọi là cây nhị phân…

 Chiều cao (chiều sâu): là mức lớn nhất của các nút lá Ví dụ cây trên có nút lá bậc lớn nhất là H, K, L mức 3, vậy chiều caocủa cây là 3

 Độ dài đường đi đến nút x: là số nhánh (cạnh nối hai nút) cần

đi qua tính từ nút gốc đến nút x Hay độ dài đường đi đến nút mức i chính là i Ví dụ nút E có độ dài đường đi là 2

 Khi bạn đã nắm được các khái niệm cơ bản này, chúng ta hãyđến luôn với cây nhị phân

Trang 6

II CÂY NHỊ PHÂN

Cây nhị phân là một trường hợp đặc biệt của cấu trúc cây và nó cũng phổ biến nhất Đúng như tên gọi của nó, cây nhị phân có bậc là 2 và mỗi nút trong cây nhị phân đều có bậc không quá 2

1 Các khái niệm

Có một số khái niệm khác về cây nhị phân các bạn cần nắm nhưsau:

đều có bậc 2 Ví dụ như hình trên, hoặc hình trên bỏ đinút H và I cũng là cây nhị phân đúng

lá đều bằng nhau Ví dụ hình trên, tất cả các nút lá đều

có mức 3

 Cây nhị phân tìm kiếm (sẽ tìm hiểu bên dưới)

chênh lệch không quá 1 so với cây con bên phải

2 Định nghĩa cấu trúc nút

Nhìn vào hình, ta có thể dễ dàng phân tích được rằng, mỗi núttrong cây nhị phân sẽ gồm 3 thành phần như sau:

 Thành phần dữ liệu: có thể là bất kỳ kiểu dữ liệu nào

 Thành phần liên kết trái: lưu trữ địa chỉ của nút gốc củacây con bên trái Kiểu dữ liệu là con trỏ trỏ vào node

 Thành phân liên kết phải: lưu trữ địa chỉ của nút gốc củacây con bên phải Kiểu dữ liệu là con trỏ trỏ vào node

Trang 7

Chúng ta sẽ có struct lưu trữ một node như sau – ở đây để đơngiản mình sử dụng kiểu dữ liệu int cho thành phần dữ liệu củanode:

Node CreateNode int * ( init)

3 Định nghĩa cấu trúc cây

Để quản lý một cái cây, bạn chỉ cần quản lý được nút gốc, bạn

có thể đi được đến các nhánh và lá của nó từ đó Trên thực tếbạn không cần phải định nghĩa một kiểu dữ liệu nào để quản lý

cả, tuy nhiên, để cho code rõ ràng hơn, bạn nên định nghĩa mộtkiểu dữ liệu cây nữa

Trang 8

typedef Node Tree* ;

Lúc này, khi tạo một cây, bản chất là nó sẽ tạo cho bạn một contrỏ có thể trỏ vào một node

Tree myTree;

Vì nó là con trỏ nên các bạn gán nó bằng NULL để tránh lỗi,nhưng để mọi thứ rõ ràng hơn, mình sẽ dùng hàm tạo cây đơngiản gán nó bằng NULL

void CreateTree Tree( &root)

4 Duyệt cây nhị phân

Có 3 cách duyệt cây nhị phân:

 Duyệt tiền tự (NLR): duyệt nút gốc, duyệt tiền tự cây contrái, duyệt tiền tự cây con phải

 Duyệt trung tự (LNR): duyệt trung tự cây con trái, duyệtnút gốc, duyệt trung tự cây con phải

 Duyệt hậu tự (LRN): duyệt hậu tự cây con trái, duyệt hậu

tự cây con phải, duyệt nút gốc

Để bạn hiểu rõ hơn ba cách duyệt này, chúng ta sẽ sử dụng lạihình ảnh cây nhị phân trên:

 Duyệt tiền tự: A B D H I E K L C F M N G O P

Trang 10

5 Hủy cây nhị phân

Để hủy đi cây nhị phân, các bạn cũng thực hiện duyệt và xóa đicác nút của cây, tuy nhiên, các bạn dễ thấy rằng, nếu ta duyệttiền tự và trung tự, khi xóa nút nhánh thì sẽ bị mất luôn địa chỉcủa các nút con Do đó, việc hủy cây nhị phân bắt buộc phảiduyệt hậu tự Hay nói cách khác, bạn phải xóa các phần tử lànút lá xóa dần lên đến nút gốc

Chúng ta sẽ có hàm hủy như sau:

void DestroyTree Tree( &root)

Trang 11

Như vậy là chúng ta đã tìm hiểu về cách tạo một nút, kết nốichúng lại thành một cây nhị phân, duyệt cây và hủy cây Tiếptheo chúng ta sẽ tìm hiểu về cây nhị phân đặc biệt khác là câynhị phân tìm kiếm.

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

Cây nhị phân tìm kiếm là cây nhị phân mà trong đó, các phần tửcủa cây con bên trái đều nhỏ hơn phần tử hiện hành và cácphần tử của cây con bên phải đều lớn hơn phần tử hiện hành

Do tính chất này, cây nhị phân tìm kiếm không được có phần tửcùng giá trị

Nhờ vào tính chất đặc biệt này, cây nhị phân tìm kiếm được sửdụng để tìm kiếm phần tử nhanh hơn (tương tự với tìm kiếm nhịphân) Khi duyệt cây nhị phân theo cách duyệt trung tự, bạn sẽthu được một mảng có thứ tự Chúng ta sẽ lần lượt tìm hiểu quachúng

1 Thêm phần tử vào cây nhị phân tìm kiếm

Để thêm phần tử vào cây nhị phân tìm kiếm, ta phải thêm vàocây nhưng vẫn đảm bảo được cây đó vẫn là cây nhị phân tìmkiếm Ví dụ thêm phần tử 12 vào cây trong hình trên, mình sẽcần chèn vào vị trí bên trái 13 Hàm duyệt tìm vị trí thích hợp vàchèn của mình như sau:

void AddNode(Tree root,& Node node* )

{

if(root)

{

Trang 12

if(root->data == node->data )// Nếu bị trùng giá trị thì không thêm

2. Tìm một phần tử trong cây nhị phân tìm kiếm

Như đã giới thiệu ở trên, để tìm một phần tử trong cây nhị phântìm kiếm, chúng ta sẽ thực hiện tương tự việc tìm kiếm nhịphân Nếu như nút cần tìm nhỏ hơn nút đang xét, chúng ta sẽtìm cây con bên trái, ngược lại chúng ta sẽ tìm trong cây conbên phải, nếu đúng nút cần tìm thì mình sẽ trả về địa chỉ củanút đó Mình sẽ có thuật toán sau:

Node FindNode Tree * ( root,int x)

Trang 13

return root;

x rootif( < ->data)

returnFindNode(root left-> , x );// Tìm cây con bên trái returnFindNode(root right, ); -> x // Tìm cây con bên phải }

return NULL ;// Không tìm thấy

}

3. Hủy nút trên cây nhị phân tìm kiếm

Để hủy một nút có khóa X trong cây nhị phân tìm kiếm, chúng

ta cần giải quyết ba trường hợp sau:

1 Nút X là nút lá, ta xóa đi mà không làm ảnh hưởng đếncác nút khác Ví dụ xóa nút 15 đi không ảnh hưởng gìđến các nút khác

2 Nút X có 1 cây con, chúng ta chỉ cần nối nút cha của Xvới nút con của X Ví dụ xóa nút 13 đi, ta chỉ cần nối nút

18 và 15 lại, sau đó xóa nút 13 đi

3 Nút X có đầy đủ 2 cây con: vì X có đầy đủ 2 nút nên nếu

ta xóa đi, ta sẽ bị mất toàn bộ cây con Do đó chúng tacần tìm phần tử thế mạng cho X mà vẫn đảm bảo đượccây nhị phân tìm kiếm, sau đó mới xóa X đi

Đối với hai trường hợp đầu thì dễ, tuy nhiên, với trường hợp thứ

3, chúng ta cần phải giải quyết vấn đề tìm phần tử thế mạngcho x, chúng ta sẽ có hai cách thực hiện như sau:

1 Nút thế mạng là nút có khóa nhỏ nhất (trái nhất) của câycon bên phải x

Trang 14

2 Nút thế mạng là nút có khóa lớn nhất (phải nhất) củacây con bên trái x.

Lấy ví dụ cho các bạn dễ hiểu hơn, hình phía trên, xóa đi phần

tử 18 theo cách 1, phần tử lớn nhất của cây con bên trái là 15,vậy thì thay 18 bằng 15 rồi xóa đi nút 15 cuối Cách 2, phần tửnhỏ nhất của cây con bên phải là 23, vậy 18 sẽ thay bằng 23 vàxóa nút 23 đó đi

Đối với hai trường hợp đầu tiên khá đơn giản, nên mình sẽ lồng

nó vào code luôn ở phần dưới, mình sẽ giải quyết cách tìm phần

tử thế mạng ở trường hợp 3 trước và theo cả hai cách Theocách 1, mình sẽ làm như sau:

3.1 Trường hợp 1

// nút p là nút cần thay thế, tree là cây đang xét (cây bên phải)void FindAndReplace1 Tree( & ,p Tree &tree)

{

if(tree left-> )// chưa phải nhỏ nhất (trái nhất)

FindAndReplace1(p, tree->left );// tiếp tục tìm

else// tree là nút trái nhất

{

p data tree-> = ->data ;// copy data

p tree= ;// trỏ nút p vào nút tree sẽ làm thế mạng bị xóa tree tree= ->right ;// nút trái không còn tuy nhiên nút phải

có thể còn nên ta phải nối chúng lại

}

}

Đối với trường hợp này, các bạn phải gọi hàmFindAndReplace1(p, root->right) trong hàm DeleteNode ở phíatrên Trường hợp thứ 2 thì ngược lại

Trang 15

3.2 Trường hợp 2

// nút p là nút cần thay thế, tree là cây đang xét (cây bên trái)void FindAndReplace2 Tree( & ,p Tree &tree)

{

if(tree right-> ) // chưa phải lớn nhất (phải nhất)

FindAndReplace2(p, tree->right);// tiếp tục tìm

else// tree là nút trái nhất

{

p data tree-> = ->data ;// copy data

p tree= ;// trỏ nút p vào nút tree sẽ làm thế mạng bị xóa tree tree= ->left;// nút phải không còn tuy nhiên nút trái

có thể còn nên ta phải nối chúng lại

Trang 16

Node * =p root;// lưu lại nút cần xóa tránh bị ghi đè

if(!root left-> )

root root= ->right ;// trường hợp 1

else if (!root right-> )

root root= ->left;// trường hợp 2

Trang 17

Node *CreateNode(int init)

Trang 23

TÀI LIỆU THAM KHẢO

2 Chat GPT

Ngày đăng: 05/04/2024, 14:39

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w