You are on page 1of 7

Duyệt cây là gì?

Duyệt cây là một tiến trình để truy cập các nút của một cây.
Chúng ta lần lượt ghé thăm các đỉnh của cây có gốc theo một thứ tự nào đó.
Có 3 cách duyệt cây theo thứ tự
- Thứ tự trước (Preorder Traversal)
- Thứ tự giữa (Inorder Traversal)
- Thứ tự sau (Postorder Traversal)

I. Thứ tự trước – Tiền thứ tự (Preorder Traversal)


Bước 1: Ghé thăm gốc
Bước 2: Duyệt cây con bên trái gốc tiền thứ tự một cách đệ quy
Bước 3: Duyệt cây con bên phải gốc tiền thứ tự một cách đệ quy

Kết quả: A → B → D → E → C → F → G
Độ phức tạp: O(n)
#include <iostream>
using namespace std;

//Định nghĩa cấu trúc của một nút trong cây


struct Node {
string data;
struct Node *left, *right;
};
//Hàm tạo nút cây mới
Node* newNode(string data)
{
Node* temp = new Node;
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
//Hàm duyệt cây tiền thứ tự
void printPreorder(struct Node* node)
{
if (node == NULL) //Nếu nút rỗng sẽ kết thúc
return;
//Đầu tiên in giá trị của nút hiện tại
cout << node->data << " ";
//Sau đó duyệt tiền thứ tự cây con bên trái
printPreorder(node->left);
//Sau đó thực tiền thứ tự cây con bên phải
printPreorder(node->right);
}
int main()
{
struct Node* root = newNode("A");
root->left = newNode("B");
root->right = newNode("C");
root->left->left = newNode("D");
root->left->right = newNode("E");
root->right->left = newNode("F");
root->right->right = newNode("G");
//Gọi hàm duyệt cây
printPreorder(root);
return 0;
}
II. Thứ tự giữa – Trung thứ tự (Inorder Traversal)
Bước 1: Duyệt cây con bên trái gốc trung thứ tự một cách đệ quy
Bước 2: Ghé thăm gốc
Bước 3: Duyệt cây con bên phải gốc trung thứ tự một cách đệ quy

Kết quả: D → B → E → A → F → C → G

Độ phức tạp: O(n)


#include <iostream>
using namespace std;

//Định nghĩa cấu trúc của một nút trong cây


struct Node {
string data;
struct Node *left, *right;
};
//Hàm tạo nút cây mới
Node* newNode(string data)
{
Node* temp = new Node;
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
//Hàm duyệt cây trung thứ tự
void printInorder(struct Node* node)
{
if (node == NULL) //Nếu nút rỗng sẽ kết thúc

return;
// Đầu tiên duyệt trung thứ tự cây con bên trái
printInorder(node->left);
// Sau đó in giá trị của nút hiện tại
cout << node->data << " ";
// Sau đó duyệt trung thứ tự cây con bên phải
printInorder(node->right);
}
int main()
{
struct Node* root = newNode("A");
root->left = newNode("B");
root->right = newNode("C");
root->left->left = newNode("D");
root->left->right = newNode("E");
root->right->left = newNode("F");
root->right->right = newNode("G");
// Gọi hàm duyệt cây
printInorder(root);
return 0;
}
III. Thứ tự sau – Hậu thứ tự (Postorder Traversal)
Bước 1: Duyệt cây con bên trái gốc hậu thứ tự một cách đệ quy
Bước 2: Duyệt cây con bên phải gốc hậu thứ tự một cách đệ quy
Bước 3: Truy cập nút gốc

Kết quả: D → E → B → F → G → C → A

Độ phức tạp: O(n)


#include <iostream>
using namespace std;

//Định nghĩa cấu trúc của một nút trong cây


struct Node {
string data;
struct Node *left, *right;
};
//Hàm tạo nút cây mới
Node* newNode(string data)
{
Node* temp = new Node;
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
//Hàm duyệt cây hậu thứ tự
void printPostorder(struct Node* node)
{
if (node == NULL) //Nếu nút rỗng sẽ kết thúc
return;
// Đầu tiên duyệt hậu thứ tự cây con bên trái
printPostorder(node->left);
// Sau đó duyệt hậu thứ tự cây con bên phải
printPostorder(node->right);
// In giá trị nút hiện tại
cout << node->data << " ";
}
int main()
{
struct Node* root = newNode("A");
root->left = newNode("B");
root->right = newNode("C");
root->left->left = newNode("D");
root->left->right = newNode("E");
root->right->left = newNode("F");
root->right->right = newNode("G");
// Gọi hàm duyệt cây
cout <<"\n";
printPostorder(root);
return 0;
}
Bảng so sánh

Phép duyệt Thứ tự duyệt Ứng dựng


Tiền thứ tự Gốc → Trái → Phải Sao chép dây, biểu diễn
Preorder Traversal chuỗi, tìm kiếm, sắp xếp
Trung thứ tự Trái → Gốc→ Phải In ra giá trị nút theo thứ tự
Inorder Traversal tăng dần, tìm kiếm, sắp xếp
Hậu thứ tự Trái →Phải → Gốc Giải phóng bộ nhớ, tính
Postorder Traversal toán diện tích/độ cao cây

You might also like