Khi nào sử dụng Chiến lược chuyển đổi đơn hàng trước, trong đơn hàng và sau khi đặt hàng
Trước khi bạn có thể hiểu trong những trường hợp nào nên sử dụng đặt trước, theo thứ tự và đặt sau cho cây nhị phân, bạn phải hiểu chính xác cách hoạt động của mỗi chiến lược truyền tải. Sử dụng cây sau đây làm ví dụ.
Gốc của cây là 7 , nút nhất bên trái là 0 , nút gần nhất bên phải là 10 .
Đặt hàng trước truyền tải :
Tóm tắt: Bắt đầu từ gốc ( 7 ), kết thúc ở nút ngoài cùng bên phải ( 10 )
Trình tự duyệt: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10
Truyền theo thứ tự :
Tóm tắt: Bắt đầu ở nút ngoài cùng bên trái ( 0 ), kết thúc ở nút ngoài cùng bên phải ( 10 )
Trình tự truyền: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Duyệt đơn hàng sau:
Tóm tắt: Bắt đầu bằng nút ngoài cùng bên trái ( 0 ), kết thúc bằng nút gốc ( 7 )
Trình tự duyệt: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7
Khi nào sử dụng Đặt hàng trước, Đặt hàng trước hoặc Đặt hàng sau?
Chiến lược truyền tải mà lập trình viên lựa chọn phụ thuộc vào nhu cầu cụ thể của thuật toán được thiết kế. Mục tiêu là tốc độ, vì vậy hãy chọn chiến lược mang lại cho bạn các nút bạn yêu cầu nhanh nhất.
Nếu bạn biết rằng bạn cần phải khám phá rễ trước khi kiểm tra bất kỳ lá nào, bạn hãy chọn đặt hàng trước vì bạn sẽ bắt gặp tất cả các rễ trước tất cả các lá.
Nếu bạn biết bạn cần khám phá tất cả các lá trước bất kỳ nút nào, bạn chọn thứ tự sau vì bạn không mất thời gian kiểm tra rễ để tìm kiếm lá.
Nếu bạn biết rằng cây có một trình tự vốn có trong các nút và bạn muốn làm phẳng cây trở lại trình tự ban đầu của nó, thì bạn nên sử dụng phương pháp duyệt theo thứ tự . Cái cây sẽ bị san phẳng giống như cách nó được tạo ra. Việc truyền đơn đặt hàng trước hoặc đặt hàng sau có thể không kéo cây trở lại trình tự đã được sử dụng để tạo ra nó.
Thuật toán đệ quy cho Thứ tự trước, Thứ tự và Sau (C ++):
struct Node{
int data;
Node *left, *right;
};
void preOrderPrint(Node *root)
{
print(root->name); //record root
if (root->left != NULL) preOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) preOrderPrint(root->right);//traverse right if exists
}
void inOrderPrint(Node *root)
{
if (root.left != NULL) inOrderPrint(root->left); //traverse left if exists
print(root->name); //record root
if (root.right != NULL) inOrderPrint(root->right); //traverse right if exists
}
void postOrderPrint(Node *root)
{
if (root->left != NULL) postOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) postOrderPrint(root->right);//traverse right if exists
print(root->name); //record root
}