CÁC KIỂU DỮ LIỆU TRỪU TƯỢNG CƠ BẢN CẤU TRÚC DỮ LIỆU CÂY

Similar documents
Chương 3 CẤU TRÚC CÂY. Nguyễn Công Danh

Lecture 12. Trees (1/2) Nội dung bài học:

CẤU TRÚC DỮ LIỆU NÂNG CAO

STACK và QUEUE. Lấy STACK

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE:

HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA

Bộ môn HTMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

HƯỚNG DẪN SỬ DỤNG PLESK PANEL

Cài đặt và cấu hình StarWind iscsi trên Windows. iscsi SAN là gì?

Kỹ thuật thu nhỏ đối tượng trong Design (Layout)

Internet Protocol. Bởi: Phạm Nguyễn Bảo Nguyên

BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì?

Chương 5. Network Layer. Phần 1 - Địa chỉ IPv4. Tài liệu : Forouzan, Data Communication and Networking

GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM)

Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng.

Chương 5. Network Layer 19/09/2016 1

Tài liệu hướng dẫn: Stored Procedure

Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính

BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C#

ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO

HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER

Bộ môn MMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO

Bài Thực hành Asp.Net - Buổi 1 - Trang: 1

BELGIUM ONLINE APPOINTMENT

Nội dung chính của chương. Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào?

Hướng dẫn cài đặt FPT

Online Appointment System will work better with below conditions/ Hệ thống đặt hẹn online sẽ hoạt động tốt hơn với điều kiện sau đây:

Chương 6. Transport Layer. Tài liệu : Forouzan, Data Communication and Networking

Nhấn nút New để tạo 1 biến mới Trang 17

Tình huống 1: PPPoE với Username và Password

Tạo repository mới. The working tree. The staging index. Lệnh git init tạo một repository loại git. tại thư mục hiện tại: $ git init

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS (4CH - 8CH - 16CH)

Bài tập căn bản Visual Basic.Net Vòng lặp. txtn. txtketqua. btntinh. txtn. txtketqua. btntinh. Trang 1

SIMULATE AND CONTROL ROBOT

Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ

Tạo Project với MPLAB

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

Mô hình dữ liệu quan hệ (Relational data model)

Entity Framework (EF)

LÂ P TRI NH WEB ASP.NET

Bài 10: Cấu trúc dữ liệu

Chương 7. Application Layer. Tài liệu : Forouzan, Data Communication and Networking

BÀI GIẢNG CHƯƠNG 3 GIAO TIẾP KẾT NỐI SỐ LIỆU

HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT

CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE)

Bài 13: C++11. EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3

B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam;

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG HOSTING PLESK PANEL

CÁC KIỂU DỮ LIỆU TRỪU TƯỢNG CƠ BẢN TẬP HỢP

CHAPTER 6: DANH SÁCH LIÊN KẾT (LINKED LISTS)

I. Hướng Dẫn Đăng Nhập:

NHẬP MÔN LẬP TRÌNH KHOA HỌC DỮ LIỆU. Bài 10: Thư viện Pandas (2)

Bài 7: Các cấu trúc điều khiển

Bài tập lớn số 1. Giả lập bộ định thời

MỤC LỤC. Giáo trình Thiết kế web Trang 1

HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG

Bài 10. Cấu trúc liên nối. khác nhau được gọi là cấu trúc liên nối. nhu cầu trao đổi giữa các module.

Môn Học: Cơ Sở Dữ Liệu 2. Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN

Google Search Engine. 12/24/2014 Google Search Engine 1

LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách)

SIEMENS INDUSTRIAL NETWORKS

Các kiểu định địa chỉ họ MSC-51

Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5.

Ôn tập Thiết bị mạng và truyền thông DH07TT - Lưu hành nội bộ (không sao chép dưới mọi hình thức)

BÀI 6a LẬP TRÌNH ĐA TUYẾN (MULTI THREAD)

Tìm hiểu Group Policy Object và các ví dụ

PHÁT TRIỂN ỨNG DỤNG WEB

NHÚNG. Vi ñiều khiển BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 2

METAPOST. 1.1 Cấu trúc file Metapost. 1.2 Cấu trúc trong Preamble. beginfig(...) endfig;... extra_beginfig(...) extra_endfig... begingraph(...

BẢO MẬT TRONG SQL SERVER

LẬP TRÌNH 8051 SỐ HỌC VÀ LÔ GIC

TỔNG QUAN VỀ.NET VÀ C#

BÀI THỰC HÀNH SỐ 1. Quản trị tập tin: 1/ Tạo các thư mục sau: Bài tập thực hành linux Linuxlab. bt1 bt11 bt111. bt121. bt12. bh1 bh11 bh111.

Đa ngôn ngữ (Internationalization) trong Servlet

Dọn "rác" Windows 7 vào dịp cuối năm

Bài thực hành 1: Chỉ mục trong SQL Server

BÀI LAB ĐỔI TÊN DOMAIN

Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY

Khoa Công Nghệ Thông Tin Trường Đại Học Cần Thơ. Những hỗ trợ tiên tiến khác của SQL. Đỗ Thanh Nghị

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

GV: Phạm Đình Sắc or

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

Kích hoạt phương thức xa (RMI- Remote Method Invocation )

KIẾN TRÚC MÁY TÍNH. Giảng viên: ThS. Phan Thanh Toàn. v

B3: Bên khung Package Explore bên trái đi tới thư mục res, bạn sẽ thấy có 3 thư mục con:

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

HƯỚNG DẪN QUẢN TRỊ HỆ THỐNG

1 Bước 1: Test thử kit LaunchPad.

Chương 4 CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP. N.C.Danh

Bài thực hành số 2 QUYỀN và ROLE

Hướng Dẫn Thực Hành Tập tin & Thư mục

Module2: Lập trình Shell và C Quản lý tiến trình A. TÓM TẮT LÝ THUYẾT:

Cập nhật ResultSet trong JDBC

biến Global có thể được áp dụng cho tất cả các extension trong tất cả các context trong Dialplan.

NỘI DUNG ÔN TẬP MÔN HỆ CƠ SỞ DỮ LIỆU

Mạng máy tính - Computer Network: Hệ. Giao thức - Protocol:

2.4. GIAO THỨC MQTT Các khái niệm cơ bản MQTT được phát triển bởi IBM và Eurotech, phiên bản mới nhất là MQTT 3.1 MQTT (Giao vận tầm xa) là

dụng một chính sách, điều này giúp dễ dàng quản lý và cung cấp tính năng Load Balancing (cân bằng tải) phục vụ tốt hơn các yêu cầu của tổ chức.

Transcription:

CÁC KIỂU DỮ LIỆU TRỪU TƯỢNG CƠ BẢN CẤU TRÚC DỮ LIỆU CÂY Đỗ Thanh Nghị dtnghi@cit.ctu.edu.vn

NỘI DUNG CÁC THUẬT NGỮ CƠ BẢN CÁC PHÉP TOÁN CHÍNH CÁC PHƯƠNG PHÁP CÀI ĐẶT CÂY CÂY NHỊ PHÂN CÂY TÌM KIẾM NHỊ PHÂN 2

CÁC THUẬT NGỮ CƠ BẢN (1) Định nghĩa Cây (tree) Nút (nodes) Ví dụ: A B C D E F 3

4 CÁC THUẬT NGỮ CƠ BẢN (2) Cây: cấu trúc đệ qui n Nút gốc C â y c o n n1 n1 nk T1 T2... Tk

5 CÁC THUẬT NGỮ CƠ BẢN (3) Ví dụ

CÁC THUẬT NGỮ CƠ BẢN (4) Nút cha con: nút A là cha của nút B khi nút A ở mức i và nút B ở mức i+1, đồng thời giữa A và B có cạnh nối. VD: Ở cây trên, nút B là cha của G và H. Nút I là con của D. Bậc của nút là số cây con của nút đó, bậc nút lá =0. VD: A có bậc 5, C có bậc 0, O có bậc 1 Bậc của cây là bậc lớn nhất của các nút trên cây. VD: cây trên có bậc 5. Cây n-phân là cây có bậc n. VD: Bậc của cây là 5 hay cây ngũ phân 6

7 CÁC THUẬT NGỮ CƠ BẢN (5) Nút gốc (root ) là nút không có cha. VD: nút gốc A Nút lá (leaf) là nút không có con. VD: các nút C, G, H, J, K, M, N, P, Q. Nút trung gian (interior node): nút có bậc khác 0 và không phải là nút gốc VD: các nút B, D, E, F, I, L, O Nút tiền bối(descendant) & nút hậu duệ(ancestor): Nếu có đường đi từ nút a đến nút b thì nút a là tiền bối của b, còn b là hậu duệ của a. VD: D là tiền bối của Q, còn Q là hậu duệ của D Cây con của 1 cây là 1 nút cùng với tất cả các hậu duệ của nó.

CÁC THUẬT NGỮ CƠ BẢN (6) Đường đi là một chuỗi các nút n1, n2,..., nk trên cây sao cho ni là nút cha của nút ni+1 (i=1..k-1) VD: có đường đi A, D, I, O, Q Độ dài đường đi bằng số nút trên đường đi trừ 1 VD: độ dài đường đi A,D,I,O,Q = 5-1=4 Chiều cao của 1 nút là độ dài đường đi từ nút đó đến nút lá xa nhất. VD: nút B có chiều cao 1, nút D có chiều cao 3 Chiều cao của cây là chiều cao của nút gốc VD: chiều cao của cây là 4 8

CÁC THUẬT NGỮ CƠ BẢN (7) Độ sâu của 1 nút là độ dài đường đi từ nút gốc đến nút đó, hay còn gọi là mức (level) của nút đó. VD: I có độ sâu 2, E có độ sâu 1 M, N, O, P có cùng mức 3 9

CÁC THUẬT NGỮ CƠ BẢN (8) Cây có thứ tự Nếu ta phân biệt thứ tự các nút trong cùng 1 cây thì ta gọi đó là có thứ tự. Ngược lại, gọi là cây không có thứ tự. Trong cây có thứ tự, thứ tự qui ước từ trái sang phải. A A B C C B G H H G 10

CÁC THUẬT NGỮ CƠ BẢN (9) A B C D E G H siblings Các nút con cùng một nút cha gọi là các nút anh em (siblings) Mở rộng: nếu ni và nk là hai nút anh em và nút ni ở bên trái nút nk thì các hậu duệ của nút ni là bên trái mọi hậu duệ của nút nk 11

CÁC THUẬT NGỮ CƠ BẢN (10) Duyệt cây: Quy tắc: đi qua lần lượt tất cả các nút của cây, mỗi nút đúng một lần Danh sách duyệt cây: là danh sách liệt kê các nút theo thứ tự đi qua Có 3 phương pháp duyệt tổng quát: tiền tự (preorder) trung tự (inorder) hậu tự (posorder) 12

CÁC THUẬT NGỮ CƠ BẢN (11) Định nghĩa theo đệ qui các phép duyệt Cây rỗng hoặc cây chỉ có một nút: cả 3 biểu thức duyệt là rỗng hay chỉ có một nút tương ứng Ngược lại, giả sử cây T có nút gốc là n và các cây con là T1, T2,...,Tn thì: Biểu thức duyệt tiền tự của cây T là nút n, kế tiếp là biểu thức duyệt tiền tự của các cây T1, T2,...,Tn theo thứ tự đó Biểu thức duyệt trung tự của cây T là biểu thức duyệt trung tự của cây T1, kế tiếp là nút n rồi đến biểu thức duyệt trung tự của các cây T2,...,Tn theo thứ tự đó Biểu thức duyệt hậu tự của cây T là biểu thức duyệt hậu tự của các cây T1, T2,...,Tn theo thứ tự đó rồi đến nút n 13

14 CÁC THUẬT NGỮ CƠ BẢN (13) Ví dụ A B C D E G H T U =>Các biểu thức duyệt: tiền tự: A B G H C D T X Y U E trung tự: G B H A C X T Y D U E hậu tự: G H B C X Y T U D E A X Y

CÁC THUẬT NGỮ CƠ BẢN (16) Cây có nhãn và cây biểu thức (labeled trees and expression trees) nuït nhaîn n n 2 + n 1 * n 3 + a b a c n 4 n 5 n 6 n 7 - Lưu trữ kết hợp một nhãn (label) hoặc một giá trị 1(value) với một nút trên cây - Nhãn: giá trị được lưu trữ tại nút đó, còn gọi là khóa của nút - VD: (a+b)*(a+c) 15

CÁC PHÉP TOÁN CƠ BẢN TRÊN CÂY Tên hàm MAKENULL(T ) EMPTY(T ) ROOT(T ) PARENT(n, T ) LEFTMOST_CHILD(n, T ) RIGHT_SIBLING(n, T ) Diển giải Tạo cây T rỗng Kiểm tra xem cây T có rỗng không? Trả về nút gốc của cây T Trả về cha của nút n trên cây T Trả về con trái nhất của nút n Trả về anh em phải của nút n LABEL(n, T ) CREATEi(v, T 1, T 2,...,T i ) Trả về nhãn của nút n Tạo cây mới có nút gốc n nhãn là v, và có i cây con. Nếu n=0 thì cây chỉ có một nút n 16

CÁC PHƯƠNG PHÁP CÀI ĐẶT CÂY CÀI ĐẶT CÂY BẰNG MẢNG CÀI ĐẶT CÂY BẰNG DANH SÁCH CÁC NÚT CON CÀI ĐẶT CÂY THEO PHƯƠNG PHÁP CON TRÁI NHẤT VÀ ANH EM PHẢI CÀI ĐẶT CÂY BẰNG CON TRỎ 17

18 CÀI ĐẶT CÂY BẰNG MẢNG (1) Mô hình A 0 B 1 C 2 D E F G H 3 4 5 6 7

CÀI ĐẶT CÂY BẰNG MẢNG (2) 19

CÀI ĐẶT CÂY BẰNG MẢNG (3) Khai báo #define MAXLENGTH... //chỉ số tối đa của mảng #define NIL -1 typedef... DataType; typedef int Node; typedef struct { DataType Data[MAXLENGTH]; //nhãn (dliệu) của cây Node Parent[MAXLENGTH]; int MaxNode; //Số nút thực sự trong cây Tree; Tree T; //nút cha của các nút 20

CÀI ĐẶT CÂY BẰNG MẢNG Khởi tạo cây rỗng: void MakeNull_Tree (Tree *T) { (*T).MaxNode=0; Kiểm tra cây rỗng int EmptyTree(Tree T) { return T.MaxNode == 0; Xác định nút cha của nút trên cây Node Parent(Node n, Tree T) { if(emptytree(t) (n>t.maxnode-1)) return NIL; else return T.Parent[n]; 21

22 CÀI ĐẶT CÂY BẰNG MẢNG (5) Đọc nhãn của nút trên cây DataType Label_Node(Node n,tree T) { if(!emptytree(t)&&(n<=t.maxnode-1)) return T.Data[n]; Hàm trả về nút gốc trong cây Node Root(Tree T) { if (!EmptyTree(T)) return 0; else return NIL;

CÀI ĐẶT CÂY BẰNG MẢNG (6) Hàm trả về con trái nhất của một nút Node LeftMostChild(Node n, Tree T) { Node i; int found; if (n<0) return NIL; i=n+1; found=0; while ((i<=t.maxnode-1) &&!found) if (T.Parent[i]==n) found=1; else i=i+1; if (found) return i; else return NIL; 23

24 CÀI ĐẶT CÂY BẰNG MẢNG (7) Hàm xác định anh em phải của một nút Node RightSibling(Node n,tree T) { Node i,parent; int found; if (n<0) return NIL; parent=t.parent[n]; i=n+1; found=0; while ((i<=t.maxnode-1) &&!found) if (T.Parent[i]==parent) found=1; else i=i+1; if (found) return i; else return NIL;

25 CÀI ĐẶT CÂY BẰNG MẢNG (8) Thủ tục duyệt tiền tự void PreOrder(Node n,tree T) { if (n!= NIL) { Node i; printf("...", Label_Node(n,T)); i=leftmostchild(n,t); while (i!=nil) { PreOrder(i,T); i=rightsibling(i,t);

CÀI ĐẶT CÂY BẰNG MẢNG (9) Thủ tục duyệt trung tự void InOrder(Node n, Tree T) { if (n!= NIL) { Node i; i=leftmostchild(n, T); if (i!=nil) InOrder(i,T); printf("... ",Label_Node(n,T)); i=rightsibling(i,t); while (i!=nil) { InOrder(i,T); i=rightsibling(i,t); 26

27 CÀI ĐẶT CÂY BẰNG MẢNG (10) Thủ tục duyệt hậu tự void PostOrder(Node n,tree T) { if (n!=nil) { Node i; i=leftmostchild(n,t); while (i!=nil) { PostOrder(i,T); i=rightsibling(i,t); printf("... ",Label_Node(n,T));

BÀI TẬP (1) Viết chương trình nhập dữ liệu vào cho cây từ bàn phím như: Tổng số nút trên cây Ứng với từng nút thì phải nhập nhãn của nút, cha của một nút Hiển thị danh sách duyệt cây theo các phương pháp duyệt tiền tự, trung tự, hậu tự 28

BÀI TẬP (2) void ReadTree(Tree *T) { int i; MakeNull_Tree(T); do{ printf("nhap so nut "); scanf("%d",&(t->maxnode)); while ((T->MaxNode<1) (T->MaxNode>MAXLENGTH)); printf("nhap nhan cua nut goc "); fflush(stdin); scanf("%c",&(*t).data[0]); (*T).Parent[0]=NIL; // nut goc khong co cha for (i=1;i<=(*t).maxnode-1;i++){ printf("nhap cha cua nut %d ",i); scanf("%d",&(*t).parent[i]); printf("nhap nhan cua nut %d ",i); fflush(stdin); scanf("%c",&(*t).data[i]); 29

BÀI TẬP (3) void main(){ printf("nhap du lieu cho cay tong quat\n"); ReadTree(&T); printf("danh sach duyet tien tu cua cay la\n"); PreOrder(Root(T),T); printf("\ndanh sach duyet trung tu la\n"); InOrder(Root(T),T); printf("\ndanh sach duyet hau tu cua cay la\n"); PostOrder(Root(T),T); 30

31 CÀI ĐẶT CÂY BẰNG DS CÁC NÚT CON (1) Minh họa A 0 F 1 B C 2 D 3 E 4 5 G 6 7 8 9 H I J

32 CÀI ĐẶT CÂY BẰNG DS CÁC NÚT CON (2) Mỗi nút có một danh sách các nút con Thường sử dụng cấu trúc danh sách liên kết để cài đặt các nút con do số lượng các nút con này biến động Khai báo: typedef int node; typedef... LabelType typedef... LIST; typedef struct { LIST header[maxlength]; LabelType labels[maxlength]; node root; TREE;

CÀI ĐẶT CÂY THEO PHƯƠNG PHÁP CON TRÁI NHẤT VÀ ANH EM PHẢI Ví dụ 33

Định nghĩa CÂY NHỊ PHÂN (1) Là cây rỗng hoặc có tối đa hai nút con Hai nút con có thứ tự phân biệt rõ ràng Con trái (left child): nằm bên trái nút cha Con phải (right child): nằm bên phải nút cha Ví dụ 1 Alex Alex Abner Abner Angela Angela Abigail Adela Adela Alice Alice Audrey Adam Adam Agnes Agnes Allen Allen Arthur Arthur 34

CÂY NHỊ PHÂN (2) Ví dụ 2 1 1 2 2 3 4 3 4 5 =>Là 2 cây nhị phân khác nhau 5 35

DUYỆT CÂY NHỊ PHÂN Các biểu thức duyệt: (N:Node, R:Right, L:Left) Tiền tự (NLR): duyệt nút gốc, duyệt tiền tự con trái, duyệt tiền tự con phải. Trung tự (LNR): duyệt trung tự con trái, duyệt nút gốc, duyệt trung tự con phải. Hậu tự (LRN): duyệt hậu tự con trái, duyệt hậu tự con phải, duyệt nút gốc. 36

CÀI ĐẶT CÂY NHỊ PHÂN (1) Khai báo typedef TData; typedef struct TNode* TNodeType; struct TNode { TData data; TNodeType left,right; ; typedef TNodeType TTree; Tạo cây rỗng void MakeNullTree(TTree *T) { (*T)=NULL; Kiểm tra cây rỗng int EmptyTree(TTree T) { return T==NULL; left Data right 37

CÀI ĐẶT CÂY NHỊ PHÂN (1) Xác định con trái TTree LeftChild(TTree n) { if (n!=null) return n->left; else return NULL; Xác định con phải TTree RightChild(TTree n) { if (n!=null) return n->right; else return NULL; Kiểm tra xem một nút có phải là lá không? int IsLeaf(TTree n) { if(n!=null) return(leftchild(n)==null)&&(rightchild(n)==null); else return NULL; 38

CÀI ĐẶT CÂY NHỊ PHÂN (1) Duyệt tiền tự void PreOrder(TTree T) { if (T!= NULL) { printf("...",t->data); //if (LeftChild(T)!=NULL) PreOrder(LeftChild(T)); //if(rightchild(t)!=null) PreOrder(RightChild(T)); 39

CÀI ĐẶT CÂY NHỊ PHÂN (1) Duyệt trung tự void InOrder(TTree T) { if (T!= NULL) { //if (LeftChild(T)=!NULL) InOrder(LeftChild(T)); printf("... ",T->data); //if(rightchild(t)!=null) InOrder(RightChild(T)); 40

41 CÀI ĐẶT CÂY NHỊ PHÂN (1) Duyệt hậu tự void PostOrder(TTree T) { if (T!= NULL) { //if(leftchild(t)!=null) PostOrder(LeftChild(T)); //if(rightchild(t)!=null) PostOrder(RightChild(T)); printf("... ",T->data);

42 CÀI ĐẶT CÂY NHỊ PHÂN (1) Xác định số nút trong cây int nb_nodes(ttree T) { if(emptytree(t)) return 0; else return 1 + nb_nodes(leftchild(t))+ nb_nodes(rightchild(t));

43 CÀI ĐẶT CÂY NHỊ PHÂN (1) Tạo cây mới từ hai cây có sẵn TTree Create2(TData v,ttree l,ttree r) { TTree N; N=(TNodeType)malloc(sizeof(struct TNode)); N->data=v; N->left=l; N->right=r; return N;

CÂY TÌM KIẾM NHỊ PHÂN (Binary search tree-bst) Định nghĩa Cây BST là cây nhị phân mà khóa tại mỗi nút lớn hơn khóa của tất cả các nút thuộc cây con bên trái và nhỏ hơn khóa của tất cả các nút thuộc cây con bên phải. Mô hình a Các phần tử < a Các phần tử > a 44

CÂY TÌM KIẾM NHỊ PHÂN Ví dụ 27 12 40 4 20 34 50 30 Nhận xét Trên cây BST không có 2 nút cùng khóa. Cây con của 1 cây BST là 1 cây tìm kiếm nhị phân. Duyệt trung tự tạo thành dãy khóa có giá trị tăng: 4, 12, 20, 27, 30, 34, 40, 50 45

CÀI ĐẶT CÂY BST Khai báo typedef... KeyType; typedef struct Node* NodeType; struct Node { KeyType key; NodeType left, right; ; typedef NodeType Tree; 46

CÀI ĐẶT CÂY BST Tìm kiếm một nút có khoá x Bắt đầu từ nút gốc ta tiến hành các bước sau: Nếu nút gốc bằng NULL thì khóa X không có trên cây. Nếu X bằng khóa nút gốc thì giải thuật dừng vì đã tìm gặp X trên cây. Nếu X nhỏ hơn nhãn của nút hiện hành: tìm X trên cây con bên trái Nếu X lớn hơn nhãn của nút hiện hành: tìm X trên cây con bên phải 47

CÀI ĐẶT CÂY BST Tree Search(KeyType x, Tree Root){ if (Root == NULL) return NULL;//không tìm thấy x else if (Root->key == x) // tìm thấy khoá x return Root; else if (Root->key < x) return Search(x,Root->right); else return Search(x,Root->left); 48

CÀI ĐẶT CÂY BST Thêm một nút có khoá x vào cây Muốn thêm 1 nút có khóa X vào cây BST, trước tiên ta phải tìm kiếm xem đã có X trên cây chưa. Nếu có thì giải thuật kết thúc, nếu chưa thì ta mới thêm vào. Việc thêm vào không làm phá vỡ tính chất cây BST. Giải thuật thêm vào như sau: bắt đầu từ nút gốc ta tiến hành các bước sau: Nếu nút gốc bằng NULL thì khóa X chưa có trên cây, do đó ta thêm 1 nút mới. Nếu X bằng khóa nút gốc thì giải thuật dừng vì X đã có trên cây. Nếu X nhỏ hơn nhãn của nút hiện hành: xen X vào cây con bên trái Nếu X lớn hơn nhãn của nút hiện hành: xen X vào cây con bên phải 49

CÀI ĐẶT CÂY BST Ví dụ: Xen nút có khóa 32 27 12 40 4 20 34 50 27 30 12 40 4 20 34 50 30 Các thao tác xen 32 50

CÀI ĐẶT CÂY BST void InsertNode(KeyType x, Tree *Root) { if (*Root == NULL) { (*Root)=(NodeType)malloc(sizeof(struct Node)); (*Root)->key = x; (*Root)->left = NULL; (*Root)->right = NULL; else if (x < (*Root)->key) InsertNode(x, &((*Root)->left)); else if (x > (*Root)->key) InsertNode(x, &((*Root)->right)); 51

CÀI ĐẶT CÂY BST Xóa một nút khóa X khỏi cây Muốn xóa 1 nút có khóa X trên cây BST. Trước tiên ta phải tìm xem có X trên cây không. Nếu không thì giải thuật kết thúc Nếu gặp nút N chứa khóa X, có 3 trường hợp xảy ra 52

CÀI ĐẶT CÂY BST Trường hợp 1: N là nút lá: thay nút này bởi NULL Ví dụ: Xóa nút nhãn 20 27 27 12 40 12 40 4 20 34 50 4 34 50 Nút cần xóa 30 30 53

Trường hợp 2 CÀI ĐẶT CÂY BST N có một cây con: thay nút này bởi cây con của nó Ví dụ: xóa nút có nhãn 34 27 12 40 27 4 34 50 12 40 cây con 30 nút cần xóa 4 30 50 54

CÀI ĐẶT CÂY BST Trường hợp 3 N có hai cây con: thay nút này bởi Nút có nhãn lớn nhất của cây con bên trái, hoặc Nút có nhãn nhỏ nhất của cây con bên phải 55

56 CÀI ĐẶT CÂY BST Ví dụ: Xoá nút có nhãn 27 4 12 40 nhãn lớn nhất ở bên trái 27 nút cần xóa 30 50 12 40 30 4 30 50 4 12 40 50 nhãn nhỏ nhất ở bên phải

CÀI ĐẶT CÂY BST void DeleteNode(KeyType x, Tree *Root) { if ((*Root)!= NULL) if (x < (*Root)->key) DeleteNode(x, &((*Root)->left)); else if (x > (*Root)->key) DeleteNode(x, &((*Root)->right)); else if ((*Root)->left == NULL) (*Root) = (*Root)->right; else if ((*Root)->right == NULL) (*Root) = (*Root)->left; else (*Root)->key = DeleteMin(&((*Root)->right)); 57

CÀI ĐẶT CÂY BST KeyType DeleteMin(Tree *Root) { KeyType k; if ((*Root)->left == NULL) { k=(*root)->key; (*Root) = (*Root)->right; return k; else DeleteMin(&((*Root)->left)); 58

59 KIẾN THỨC BỔ SUNG (1) Thời gian tìm kiếm một giá trị trên một cây TKNP có N nút là: O(log N) ) nếu cây cân bằng (balanced) O(N) ) nếu cây không cân bằng (unbalanced)

60 KIẾN THỨC BỔ SUNG (2) Bên dưới là một cây TKNP phân không cân bằng Abigail Abigail Adam Abner Abner Adam Adela Adela Agnes Alex Alex Alice Alice Allen Allen Angela Angela Arthur Arthur Audrey Audrey

CÂY NHỊ PHÂN ĐẦY ĐỦ (1) (full binary tree) Một cây nhị phân là cây nhị phân đầy đủ nếu và chỉ nếu Mỗi nút không phải lá có chính xác 2 nút con Tất cả các nút lá có chiều cao bằng nhau 61

62 CÂY NHỊ PHÂN ĐẦY ĐỦ (2) Ví dụ -Một cây nhị phân đầy đủ

63 CÂY NHỊ PHÂN ĐẦY ĐỦ (3) Câu hỏi về cây nhị phân đầy đủ: Một cây nhị phân đầy đủ chiều cao h sẽ có bao nhiêu nút lá? Một cây nhị phân đầy đủ chiều cao h sẽ có tất cả bao nhiêu nút?

64 CÂY NHỊ PHÂN HOÀN CHỈNH (1) (complete binary tree) Một cây nhị phân hoàn chỉnh (về chiều cao) thỏa mãn các điều kiện sau: Mức 0 đến h-1 là trình bày một cây nhị phân đầy đủ chiều cao h-1 Một hoặc nhiều nút ở mức h-1 có thể có 0, hoặc 1 nút con Nếu j, k là các nút ở mức h-1, khi đó j có nhiều nút con hơn k nếu và chỉ nếu j ở bên trái của k

65 CÂY NHỊ PHÂN HOÀN CHỈNH (2) Ví dụ AA BB CC DD E F G G HH II J K K Figure 13.8 A complete binary tree

66 CÂY NHỊ PHÂN HOÀN CHỈNH (3) Được cho một tập hợp N nút, một cây nhị phân hoàn chỉnh của những nút này cung cấp số nút lá nhiều nhất - với chiều cao trung bình của mỗi nút là nhỏ nhất Cây hoàn chỉnh n nút phải chứa ít nhất một nút có chiều cao là log n n

67 CÂY NHỊ PHÂN CÂN BẰNG VỀ CHIỀU CAO (Height-balanced Binary Tree ) Một cây nhị phân cân bằng về chiều cao là một cây nhị phân như sau: Chiều cao của cây con trái và phải của bất kỳ nút nào khác nhau không quá một đơn vị Chú ý: mỗi cây nhị phân hoàn chỉnh là một cây cân bằng về chiều cao

CÂY CÂN BẰNG VỀ CHIỀU CAO VÍ DỤ N M N- M<=1 Cân bằng về chiều cao là một thuộc tính cục bộ 68

ƯU ĐIỂM CỦA CÂY CÂN BẰNG Cây nhị phân cân bằng về chiều cao là cây cân bằng Thời gian tìm kiếm một nút trên cây N nút là O(logN) 69