1. Trang chủ
  2. » Nghệ sĩ và thiết kế

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

66 71 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 66
Dung lượng 1,14 MB

Nội dung

Xây dựng cây từ kết quả duyệt theo thứ tự trước (NLR).  Chọn giá trị đầu tiên làm node gốc[r]

(1)

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

TMT

(2)

NỘI DUNG

1 Các khái niệm Đặc điểm

3 Hình dạng

4 Các khái niệm

5 Định nghĩa kiểu liệu Các lưu ý cài đặt

7 Các thao tác

(3)

CÁC KHÁI NIỆM

 Bậc nút: số

của nút

 Nút gốc: nút khơng có nút

cha

 Nút lá: nút có bậc  Nút nhánh: nút có bậc

khác gốc

(4)

Mức Mức Mức Mức

CÁC KHÁI NIỆM (TT)

 Độ dài đường từ gốc

đến nút x: số nhánh cần qua kể từ gốc đến x

 Độ cao cây: Độ dài

đường từ gốc đến nút mức thấp

(5)

ĐẶC ĐIỂM CÂY NHỊ PHÂN TÌM KIẾM

 Là nhị phân

 Giá trị node

lớn giá trị tất node bên trái nhỏ giá trị tất node bên phải

➔Nút có giá trị nhỏ nằm trái

➔Nút có giá trị lớn nằm phải

7

3 36

1 6 15 40

23 4

(6)

Nút

ĐỊNH NGHĨA KIỂU DỮ LIỆU

typedef struct TNODE {

<Data> Key;

struct TNODE *pLeft, *pRight;

} *TREE;

Giá trị

Trỏ trái Trỏ phải

TNODE

Key

pLeft pRight

(7)

VÍ DỤ KHAI BÁO CÂY NHỊ PHÂN BIỂU DIỄN CÁC NODE LÀ SỐ NGUYÊN

typedef struct TNODE {

int Key;

struct TNODE *pLeft, *pRight; } *TREE;

(8)

CÁC LƯU Ý KHI CÀI ĐẶT

Bước 1: Khai báo kiễu liệu biểu diễn cây

Bước 2: Xây dựng hàm đưa liệu (nhập) vào cây

Bước 3: Xây dựng thao tác duyệt, tìm kiếm, huỷ, …

Các lưu ý khác:

1 Trước tạo node phải xin cấp phát vùng nhớ. 2 Trước tạo phải khởi tạo rỗng.

3 Trước kết thúc chương trình phải huỷ (giải phóng vùng nhớ)

(9)

CẤU TRÚC CHƯƠNG TRÌNH

Khai báo cấu trúc cây

Khởi tạo rỗng

Xây dựng cây

Các thao tác

Hủy cây

(10)

CÁC THAO TÁC

1 Xây dựng Duyệt

3 Cho biết thông tin Tìm kiếm

5 Xố node

(11)

CÁC THAO TÁC

1 Xây dựng Duyệt

3 Cho biết thơng tin Tìm kiếm

5 Xoá node

(12)

40 15136346

XÂY DỰNG CÂY

7 36 3 1 6 4 15 40

7 ◼ Nếu node cần

thêm < node đang xét thêm về

bên trái.

◼ Ngược lại thêm

về bên phải.

(13)

XÂY DỰNG CÂY (TT)

int ThemNut (TREE & t, int x) {

if(t!=NULL)

{ if(x==t->Key) return 0;

else {

if(x<t->Key) ThemNut(t->pLeft, x); else ThemNut(t->pRight, x); }

}

else {

t=new TNODE;

if(t==NULL) return -1;

(14)

CÁC THAO TÁC

1 Xây dựng Duyệt

3 Cho biết thông tin Tìm kiếm

5 Xố node

(15)

CÁC THAO TÁC

1 Xây dựng Duyệt

3 Cho biết thơng tin Tìm kiếm

5 Xoá node

(16)

DUYỆT CÂY

Thứ tự trước (NLR) Thứ tự (LNR) Thứ tự sau (LRN)

(17)

NLR

7 L7 R7

7 3 L3 R3 36 L36 R36

7 L6 36 15 R15 40

7 4 36 15 23 40

7

3 36

1 6 15 40

23 4

(18)

NLR

Tại node t xét, nếu khác rỗng thì

In giá trị t

Duyệt bên trái của t theo thứ tự NLR Duyệt bên phải

của t theo thứ tự NLR

(19)

BÀI TẬP

Bài 1

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

27 19 10 21 35 25 41 12 46

 Hãy duyệt theo thứ tự trước

Bài 2

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

H B C A E D Z M P T

 Hãy duyệt theo thứ tự trước

Bài 3

 Hãy xây dựng 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 Bình Dương Hải Dương

(20)

LNR

L7 7 R7

L3 R3 L36 36 R36

1 L6 15 R15 36 40 1 15 23 36 40

7

3 36

1 6 15 40

23 4

(21)

LNR

Tại node t xét, khác rỗng thì

Duyệt bên trái của t theo thứ tự LNR In giá trị t

Duyệt bên phải

của t theo thứ tự LNR

(22)

LRN

L7 R7 7

L3 R3 L36 R36 36 7

1 L6 6 3 R15 15 40 36 7

1 23 15 40 36 7 7

3 36

1 6 15 40

23 4

(23)

LRN

Tại node t xét, khác rỗng thì

Duyệt bên trái của t theo thứ tự LRN Duyệt bên phải

của t theo thứ tự LRN In giá trị t

(24)

BÀI TẬP

Bài 4

Hãy xây dựng nhị phân tìm kiếm theo thứ

tự nhập sau:

27 19 10 21 3 15 41 50 30 27

Hãy duyệt theo thứ tự giữa

Bài 5

Hãy xây dựng nhị phân tìm kiếm theo thứ

tự nhập sau:

H B C A E D T M X O

Hãy duyệt theo thứ tự sau

(25)

VẤN ĐỀ CẦN QUAN TÂM

Xây dựng từ kết duyệt theo thứ tự trước (NLR)

Chọn giá trị làm node gốc.

Lần lượt đưa giá trị lại từ trái

sang phải vào theo nguyên tắc xây dựng cây.

Xây dựng từ kết duyệt theo thứ tự sau (LRN)

Chọn giá trị cuối làm node gốc.

Lần lượt đưa giá trị lại từ phải

sang trái vào theo nguyên tắc xây

(26)

VẤN ĐỀ CẦN QUAN TÂM (TT)

Xây dựng từ kết duyệt theo thứ tự giữa (LNR)

Gọi r: Số lượng giá trị cho trước.

 Gọi m = r div 2: Giá trị giữa.

 Chọn giá trị thứ m làm node gốc.

 Lần lượt đưa giá trị vị trí m-1

lùi trái vào theo nguyên tắc xây dựng cây.

 Lần lượt đưa giá trị vị trí m+1

(27)

BÀI TẬP

Bài 6

Hãy vẽ nhị phân tìm kiếm T biết rằng duyệt T theo thứ tự Left-Right-Node dãy sau: 1, 4, 7, 5, 3, 16, 18, 15, 29, 25, 30, 20, 8.

Hãy duyệt T theo thứ tự Node-Left-Right.

(28)

BÀI TẬP

Bài 7

Hãy vẽ nhị phân tìm kiếm T biết rằng duyệt T theo thứ tự Node-Left-Right dãy sau: 9, 4, 1, 3, 8, 6, 5, 7, 10, 14, 12, 13, 16, 19.

Hãy duyệt T theo thứ tự Left-Right-Node.

Liệt kê nút Liệt kê nút

(29)

CÀI ĐẶT

void Nhap(TREE &t) {

int x; do{

cout<<“Nhap gia tri: “; cin>>x;

int kq=ThemNut(t, x); if(kq==0||kq==-1)

break; }while (true);

}

(30)

CÀI ĐẶT

void main() {

TREE t; t=NULL; Nhap(t);

cout<<“Duyet cay theo thu tu giua: “; LNR(t);

Huy(t); }

(31)

CÁC THAO TÁC

1 Xây dựng Duyệt

3 Cho biết thơng tin Tìm kiếm

5 Xoá node

(32)

CÁC THAO TÁC

1 Xây dựng Duyệt

3 Cho biết thông tin Tìm kiếm

5 Xố node

(33)

CHO BIẾT CÁC THÔNG TIN CỦA CÂY

1 Số node (node bậc 0)

2 Số node có (node bậc 1)

3 Số node có phải Số node có trái

5 Số node (node bậc 2)

6 Độ cao cây

7 Số node cây

8 Các node mức cây

(34)

SỐ NODE LÁ

Nếu node t khác rỗng thì

Nếu node t có bậc thì Trả 1

Ngược lại

Trả Số node trái t + Số node phải t

Nếu node t rỗng Trả 0

(35)

SỐ NODE LÁ (TT)

int DemNutLa (TREE t) {

if(t) {

if(t->pLeft==NULL && t->pRight==NULL) return 1;

else

return DemNutLa(t->pLeft)+DemNutLa(t->pRight); }

else

return 0; }

(36)

SỐ NODE CÓ 1 CÂY CON

Nếu node t khác rỗng

d=Số node bậc trái t + Số node bậc phải t Nếu node t có bậc trả d+1 Ngược lại trả d

Nếu node t rỗng Trả

(37)

SỐ NODE CÓ 1 CÂY CON

(38)

SỐ NODE CHỈ CÓ 1 CÂY CON PHẢI

Nếu node t khác rỗng

d = Số node có phải trái t + Số node có phải phải t Nếu node t có phải trả d+1

Ngược lại trả d

Nếu node t rỗng Trả

(39)

SỐ NODE CÓ 1 CÂY CON PHẢI

int DemNut1ConPhai(TREE t) {

if(t) {

int d=DemNut1ConPhai(t->pLeft) +DemNut1ConPhai(t->pRight);

(40)

SỐ NODE CHỈ CÓ 1 CÂY CON TRÁI

(41)

SỐ NODE CÓ 2 CÂY CON

(42)

ĐỘ CAO CỦA CÂY

int DoCaoCay(TREE t) {

if(t) {

int t1=DoCaoCay(t->pLeft); int t2=DoCaoCay(t->pRight); return Max(t1, t2)+1;

}

else

return 0;

(43)

SỐ NODE CỦA CÂY

(44)

CÁC NODE TRÊN TỪNG MỨC

Mức 2: 15 40

7

3 36

1 6 15 40

23 4

(45)

CÁC NODE TRÊN TỪNG MỨC

void InMuck(TREE t, int k, int m=0) { if(t) { if(m==k) { printf("%d\t", t->Key); return; } else { m++; InMuck(t->pLeft, k,m); InMuck(t->pRight, k, m); }

} }

(46)

IN CÁC NODE CỦA TẤT CẢ MỨC

(47)

ĐỘ DÀI ĐƯỜNG ĐI TỪ GỐC ĐẾN NODE X

(48)

CÁC THAO TÁC

1 Xây dựng Duyệt

3 Cho biết thông tin Tìm kiếm

5 Xố node

(49)

CÁC THAO TÁC

1 Xây dựng Duyệt

3 Cho biết thơng tin Tìm kiếm

5 Xố node

(50)

TÌM KIẾM

1 Tìm x Tìm

3 Tìm bên phải Tìm max

5 Tìm max bên trái

(51)

VÍ DỤ TÌM X = 23

7

3 36

1 6 15 40

23 4

(52)

TÌM X

TNODE * TimKiem(TREE t,int x) {

if(t!=NULL) {

if(t->Key==x) return t; if(x<t->Key)

return TimKiem(t->pLeft,x); else

return TimKiem (t->pRight,x); }

return NULL; }

(53)

TÌM MIN

TNODE* Min(TREE t) {

while(t->pLeft!=NULL) {

t=t->pLeft; }

return t; }

(54)

MIN CÂY CON BÊN PHẢI

(55)

TÌM MAX

(56)

TÌM MAX CÂY CON BÊN TRÁI

(57)

CÁC THAO TÁC

1 Xây dựng Duyệt

3 Cho biết thơng tin Tìm kiếm

5 Xoá node

(58)

CÁC THAO TÁC

1 Xây dựng Duyệt

3 Cho biết thơng tin Tìm kiếm

5 Xoá node

(59)

XÓA NODE TRÊN CÂY

1 Node

2 Node có Node có

7

3 36

1 6 15 40

23 4

(60)

XÓA NODE LÁ

Xóa Xóa 23

7

3 36

1 6 15 40

23 4

(61)

XÓA NODE 1 CÂY CON

Xóa Xóa 15

7

3 36

1 6 15 40

23 4

4 23

(62)

XÓA NODE 2 CÂY CON

Tìm node mạng

Cách 1: Tìm node trái nhất phải Cách 2: Tìm node phải

nhất trái

Xóa 36 (Cách 2)

7

3 36

1 6 15 40

23 4

16

23

(63)

TÌM NODE THẾ MẠNG

void TimTheMang (TREE &pHuy,TREE & q) {

if(q->pLeft)

TimTheMang(pHuy, q->pLeft); else

{

pHuy->Key=q->Key; pHuy=q;

q=q->pRight; }

}

(64)

XÓA MỘT NODE CÓ GIÁ TRỊ X

void HuyNut (TREE & t, int x) {

if(t!=NULL)

{ if(x<t->Key) HuyNut(t->pLeft,x); else{

if(x>t->Key) HuyNut(t->pRight,x); else{

TNODE * pHuy=t;

if(t->pLeft==NULL) t=t->pRight; else

if(t->pRight==NULL) t=t->pLeft; else TimTheMang(pHuy,t->pRight); delete pHuy;

} }

}

(65)

HUỶ TOÀN BỘ CÂY

Nếu node khác rỗng

Hủy bên trái t Hủy bên phải t Hủy node t

(66)

Cho dãy số theo thứ tự nhập từ trái sang phải sau: 20 15 35 30 11 13 17 36 47 16 38 28 14

Hãy vẽ nhị phân tìm kiếm cho dãy

số trên.

Hãy cho biết kết duyệt

theo thứ tự trước, sau.

Cho biết độ cao cây, nút lá,

nút có bậc 2.

Vẽ lại sau thêm nút: 25 91 Trình bày bước vẽ lại sau

khi xoá nút: 11 35

Ngày đăng: 16/12/2020, 13:15

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w