Tải bản đầy đủ (.pptx) (53 trang)

Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 5.1 - Trần Minh Thái (2016)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (688.59 KB, 53 trang )

Chương 5. Cây nhị phân tìm kiếm – Phần 1
Trần Minh Thái
Email:
Website: www.minhthai.edu.vn

1


Nội dung

1.
2.
3.
4.
5.

Khái niệm
Đặc điểm
Định nghĩa cấu trúc dữ liệu
Các lưu ý khi cài đặt
Các thao tác xử lý

2


Khái niệm

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


2

2

2

0

1

1

0

 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

0

0

3


Khái niệm

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


Mức 1

Chiều cao h của cây: Mức lớn
nhất của các nút lá

Mức 2

Mức 3

Mức 4

xx

4


Đặc điểm của cây nhị phân

Số nút ở mức I ≤ 2I-1
Số nút ở mức lá ≤ 2h-1, với h là chiều cao của cây
Chiều cao của cây h ≥ log2N, với N là số nút trong cây

5


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

Cây nhị phân là một cấu trúc bao gồm các phần tử (node) được kết nối với
nhau theo quan hệ “cha-con” với mỗi cha có tối đa 2 con.


Mỗi nút gồm các thông tin:

Dữ liệu lưu trữ: data
Liên kết tới cây con trái của nút: pLeft
Liên kết tới cây con phải của nút: pRight

6


Cấu trúc của một node

data

Giá trị
TNode

Nút

Trỏ trái

pLeft

Trỏ phải

public class CMyTNode <T>
{
T data;
CMyTNode<T> pLeft = null;
CMyTNode<T> pRight = null;


//Các phương thức
}

7

pRight


Ví dụ khai báo node chứa giá trị nguyên

public class CMyIntTNode
{
int data;
CMyIntTNode pLeft = null;
CMyIntTNode pRight = null;

//Các phương thức
}

8


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

 Là 1 cây nhị phân
 Giá trị của một node luôn lớn hơn giá trị của các
node nhánh trái và nhỏ hơn giá trị các node nhánh
77


phải
Nút có giá trị nhỏ nhất nằm ở nút trái nhất của cây

33

36
36

11

66

44

15
15

Nút có giá trị lớn nhất nằm ở nút phải nhất của cây
40
40

23
23

9


Các thao tác cơ bản

1. Tạo cây

2. Duyệt cây
3. Cho biết các thơng tin của cây
4. Tìm kiếm
5. Xố node trên cây

10


Tạo cây
7

36

3

7643136
15
40
3136
764
40
15

1

6



4


15

40

Nếu node cần thêm nhỏ hơn node
đang xét thì thêm về bên trái



Ngược lại thì thêm về bên phải

11


Khai báo cấu trúc cây nhị phân

public class CMyBinaryTree <T>
{
CMyTNode<T> root = null; //Nút gốố
c
//Các phương thức
}

12


Chèn một phần tử có giá trị x vào cây: TNode(x)

B1. Nếu root là null thì

root = TNode(x) : Kết thúc
B2. Trong khi root khác null thực hiện
- Nếu data của root < x thì
chèn TNode(x) vào bên phải root
- Ngược lại:
+ Nếu data của root > x thì
chèn TNode(x) vào bên trái root
+ Ngược lại: Trùng giá trị  Kết thúc

13


Tạo TNode có giá trị x
public class CMyTNode<T>
{
T data;
CMyTNode<T> pLeft = null;
CMyTNode<T> pRight = null;

public CMyTNode(T x)
{
data = x;
pLeft = null;
pRight = null;
}
}

14



public class CMyTNode<T>
{

public bool InsertData(T x){
if (x.CompareTo(data) == 0)
return false;
if (x.CompareTo(data) < 0) {
if (pLeft == null)
pLeft = new CMyTNode<T>(x);
else return pLeft.InsertData(x);
}
else {
if (pRight == null)
pRight = new CMyTNode<T>(x);
else return pRight.InsertData(x);
}
return true;
}
}

15


public class CMyBinaryTree<T>
{
CMyTNode<T> root = null;

public bool Insert(T x)
{
if (root == null)

{
root = new CMyTNode<T>(x);
return true;
}
else
{
if (root.InsertData(x))
return true;

}
return false;
}
}


Bài tập

1.

Viết phương thức tạo cây nhị phân số nguyên từ các giá trị nhập vào từ bàn
phím. Q trình nhập cho đến khi gặp giá trị trùng

2.

Viết phương thức tạo cây nhị phân số nguyên từ dãy số nguyên cho trước

17


Duyệt cây


Thứ tự trước (PreOrder)

(NLR)

Thứ tự giữa (InOrder)

(LNR)

Thứ tự sau (PostOrder)

(LRN)

18


77

Bước
1

Kết quả duyệt theo thứ tự NLR
7

2

L7

R7


3

L3

3

1

4

33

R3

R7

R3

R7

6

L6

5

36
36

4


6

11

66

15
15

R7
44

R7
36

7

23
23

L36

R36

15

R15

R36


23

R36

8
9
KQ

40
40

40
7

3

1

6

4

36

15

23

19


40


Hàm duyệt NLR
Tại node t đang xét, nếu khác rỗng thì

 In giá trị của t
 Duyệt cây con bên trái của t theo thứ tự NLR
 Duyệt cây con bên phải của t theo thứ tự NLR

public void NLR()
{
Xuấố
t data;
if(pLeft!=null)
pLeft.NLR();
if (pRight != null)
pRight.NLR();
}

20


Bài tập
Vẽ cây nhị phân tìm kiếm theo thứ tự nhập từ trái sang phải và duyệt cây theo
thứ tự trước:

27; 19; 10; 21; 35; 25; 41; 12; 46; 7
H; B; C; A; E; D; Z; M; P; T

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

21


VD duyệt NLR cây NPTK số nguyên
public class CMyIntTNode
{
...
public void NLR()
{
Console.Write(Data + "; ");
if(pLeft!=null)
pLeft.NLR();
if (pRight != null)
pRight.NLR();
}
}

class CMyIntBinaryTree
{
...
public void PreOrder()
{
root.NLR();
}
}

22



Bước

Kết quả duyệt theo thứ tự LNR

77

1

L7

7

R7

2

L3

3

R3

7

R7

3


1

3

R3

7

R7

3

R3

7

R7

5

L6

6

7

R7

6


4

6

7

R7

6

7

R7

7

R7

4

7
8

33

36
36

11


66

15
15

44

23
23

9

L36

36

R36

10

15

R15

36

R36

23


36

R36

36

R36

11
12
13
KQ

40
1

3

4

6

7

15

23

36


23

40
40

40


Hàm duyệt LNR
Tại node t đang xét, nếu khác rỗng thì

 Duyệt cây con bên trái của t theo thứ tự LNR

public void LNR()
{

 In giá trị của t

if(pLeft!=null)
pLeft.NLR();

 Duyệt cây con bên phải của t theo thứ tự LNR

Xuấố
t data;
if (pRight != null)
pRight.NLR();
}

24



Bước

Kết quả duyệt theo thứ tự LRN

77

1

L7

R7

7

2

L3

R3

3

R7

7

3


1

R3

3

R7

7

4

L6

6

3

R7

7

5

4

6

3


R7

7

6

3

R7

7

3

R7

7

8

L36

R36

36

7

9


R15

15

R36

36

7

10

23

15

R36

36

7

15

R36

36

7


40

36

7

36

7

6
7

11

33

12

36
36

11

66

44

13
14

KQ

15
15

23
23

7
1

4

6

3

23

15

40

36

25

40
40


7


×