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