Search…

Cây Nhị Phân

02/08/20204 min read
Các khái niệm cơ bản, sơ lược về cây nhị phân - binary tree.

Cây nhị phân - Binary Tree

Cây nhị phân
Cây nhị phân

Cây nhị phân là tập hợp các nút (node) chứa giá trị liên kết với nhau theo quan hệ cha - con (lần lượt theo chiều mũi tên như hình vẽ) sao cho mỗi nút không quá 2 nút con.

Nút gốc

Nút gốc là nút không là con của bất kỳ của nút nào, là nút bắt đầu của cây nhị phân, từ đó cây nhị phân mở rộng ra.

Node gốc của cây.
Nút gốc

Nút trong

Nút trong là nút có con, bất kể 1 hoặc 2 nút con.

Node trong của cây nhị phân.
Nút trong

Nút lá

Nút lá là nút không có nút con nào.

Node lá cây nhị phân.
Nút lá

Cây con

Mỗi nút trong cây cùng với những nút phía dưới nó tạo thành một cây con.

Cây con trong cây nhị phân.
Ví dụ về cây con

Code cây nhị phân

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

Giả sử giá trị của nút là kiểu int, cần 2 biến con trỏ trỏ đến địa chỉ của hai nút con của mỗi nút.

// ...
struct Node
{
	int info;
	Node *pLeft;
	Node *pRight;
}

Định nghĩa cây nhị phân

  • Quản lý cây nhị phân từ một nút gốc ban đầu (nút không là con của nút nào khác) rồi dần duyệt xuống.
  • Các nút sẽ được thể hiện dưới dạng con trỏ được cấp phát động để có thể trình bày các dòng code dễ dàng hơn cũng như thuận tiện tạo nút mới.

Khởi tạo cây nhị phân rỗng

Khi cây chưa có nút nào, hay còn gọi là cây rỗng, nút gốc ban đầu cần được trỏ đến một địa chỉ xác định nào đó có thể có thể kiểm soát được. Như vậy mới có thể xác định được cây nhị phân hiện tại có rỗng hay chưa?

// ...
void init(Node * & tree)
{
	tree = nullptr;
}

Khởi tạo một nút với giá trị cho trước

Cấp phát động một nút và gán địa chỉ 2 nút con của nút đó có giá trị nullptr mặc định nút đó là nút lá.

Node* getNode(int value)
{
	Node *p = new Node;

	// truong hop cap phat cho p that bai, tra ve gia tri nullptr
	if (p == nullptr)
		return nullptr;

	// gan gia tri chua trong nut
	p->info = value;

	// gan dia chi hai nut con cua nut p tam thoi la nullptr
	p->pLeft = nullptr;
	p->pRight = nullptr;

	return p;
}

Thêm nút vào cây nhị phân

Tuỳ vào mục đích xây dựng và sắp xếp các nút trên cây nhị phân sẽ có những cách thêm nút phù hợp tương ứng, xác định rõ tính chất của kiểu cây nhị phân và yêu cầu của bài toán để có cách phù hợp.

Duyệt cây nhị phân theo thứ tự

Tuỳ vào mục đích sử dụng có các phương pháp duyệt cây với thứ tự khác nhau:

  • Phương pháp LNR (Left Node Right).
  • Phương pháp LRN (Left Right Node).
  • Phương pháp NLR (Node Left Right).
  • Phương pháp NRL (Node Right Left).
  • Phương pháp RNL (Right Node Left).
  • Phương pháp RLN (Right Left Node).

Tuỳ vào các mục đích duyệt cây để thực hiện công việc gì sẽ có hàm duyệt cây tương ứng. Dưới đây là hàm duyệt cây để lần lượt in ra các giá trị của mỗi nút theo đệ quy bằng C++.

Duyệt theo NLR (Node Left Right)

// ...
void show(Node *tree)
{
    // kiem tra cay nhi phan co rong khong
    // hoac khi de quy den nut la ket thuc de quy
    if (tree == nullptr)
        return;

    cout << tree->info;
    show(tree->pLeft);
    show(tree->pRight);
}

Duyệt theo LNR (Left Node Right)

// ...
void show(Node *tree)
{
    // kiem tra cay nhi phan co rong khong
    // hoac khi de quy den nut la ket thuc de quy
    if (tree == nullptr)
        return;

    show(tree->pLeft);
    cout << tree->info;
    show(tree->pRight);
}

Tương tự thay đổi thứ tự cho những cách duyệt còn lại.

Ngoài ra còn có thể nâng cấp nhiều tính năng hơn cho cây nhị phân để có thể sử dụng giải quyết các nhu cầu thực tế như từ điển.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024