Sự hữu ích của truyền tải trước và sau của cây nhị phân


13

Điều này có thể rất ngây thơ, nhưng tôi đã tự hỏi, đó là bối cảnh của cây nhị phân (đơn giản, được sắp xếp và cân bằng), của tất cả các loại truyền tải:

  • đặt hàng trước sâu
  • theo thứ tự chiều sâu
  • độ sâu sau khi đặt hàng
  • bề rộng đầu tiên

những tiện ích thực sự của những người trước và sau khi đặt hàng là gì? Ý tôi là, có một số loại và / hoặc cấu hình của cây nhị phân trong đó giao dịch trước và / hoặc sau đặt hàng sẽ mang lại (một số) lợi thế so với hai loại kia?

AFAICS, có một số loại và cấu hình nhất định của cây nhị phân mà theo thứ tự và chiều rộng đầu tiên có thể mang lại một lợi thế nhất định:

  • đối với cây nhị phân cân bằng, mọi giao dịch theo chiều sâu đầu tiên sẽ sử dụng ít không gian lưu trữ bộ nhớ hơn so với chiều rộng đầu tiên (ví dụ: đối với cây nhị phân cân bằng 6 hoặc 7 nút, chiều cao là 2 vì vậy bất kỳ giao dịch theo chiều sâu nào cũng cần lưu trữ tối đa 2 nút tại bất kỳ thời điểm nào, trong khi cấp độ cuối cùng có 3 hoặc 4 nút, do đó, giao dịch theo chiều rộng đầu tiên sẽ cần lưu trữ tối đa 3 hoặc 4 nút tại một số điểm). Trong trường hợp này, sử dụng truyền tải theo thứ tự sử dụng ít bộ nhớ nhất và truy cập các nút theo thứ tự tự nhiên của chúng.

  • đối với cây nhị phân không cân bằng, nếu nó gần với kịch bản chèn trường hợp xấu nhất, thì việc vượt qua nó theo chiều rộng đầu tiên sẽ sử dụng ít bộ nhớ hơn so với bất kỳ giao dịch theo chiều sâu nào. Vì vậy, trong trường hợp này chiều rộng đầu tiên cung cấp một lợi thế. Truyền tải theo thứ tự có một lần nữa lợi thế của việc truy cập các giá trị theo thứ tự tự nhiên của chúng.

Tuy nhiên, tôi không thể nghĩ đến một tình huống mà trước và sau khi truyền tải sẽ mang lại lợi thế hơn hai người kia.

Câu trả lời:


13

Bạn cần làm nhiều việc khác nhau với cây, như dịch giữa cấu trúc dữ liệu và một số biểu diễn nối tiếp, như trên tệp hoặc bằng ngôn ngữ.

Vì vậy, ví dụ, giả sử bạn có một cây phân tích như thế này:

    *
   / \
  +   \
 / \   \
A   B   C

Bạn có thể tuần tự hóa nó * + A B Cbằng cách đi bộ theo thứ tự tiền tố hoặc A B + C *bằng cách đi bộ theo thứ tự hậu tố. Nếu bạn làm việc với các bộ xử lý ngôn ngữ, những thứ như vậy cần phải có tính chất thứ hai.


Ví dụ rất hay! Và lưu ý cách mang lại thứ tự theo thứ tự sẽ mang lại A + B * C, điều này dễ hiểu hơn nhiều đối với người dùng bình thường so với tiền tố của thứ tự postfix.
Kilian Foth

3
@KilianFoth ngoại trừ đó không phải là những gì cây nói - nó nói (A + B) * C, ít nhất là trong mắt tôi. Mặc dù các ngón tay HP-28 của tôi thích phiên bản AB + C * rất tốt. :-)
sdg

@Kilian: sdg đúng. Với inorder, bạn phải quan tâm đến quyền ưu tiên, trừ khi bạn đặt dấu ngoặc đơn xung quanh mọi thứ.
Mike Dunlavey

13

Các bài viết wikipedia có một mô tả ngắn gọn đẹp khi bạn muốn sử dụng các loại khác nhau của tìm kiếm theo chiều sâu:

  • Chuyển đổi trước khi đặt hàng trong khi sao chép các nút và giá trị có thể tạo một bản sao hoàn chỉnh của cây nhị phân. Nó cũng có thể được sử dụng để tạo một biểu thức tiền tố (ký hiệu Ba Lan) từ cây biểu thức: duyệt qua cây biểu thức theo thứ tự trước.
  • Truyền tải theo thứ tự được sử dụng rất phổ biến trên các cây tìm kiếm nhị phân vì nó trả về các giá trị từ tập hợp cơ bản theo thứ tự, theo bộ so sánh thiết lập cây tìm kiếm nhị phân (do đó có tên).
  • Truyền tải sau khi đặt hàng trong khi xóa hoặc giải phóng các nút và giá trị có thể xóa hoặc giải phóng toàn bộ cây nhị phân. Nó cũng có thể tạo ra một đại diện postfix của cây nhị phân.

Nó nắm bắt được nhu cầu hậu cần của một thuật toán. Ví dụ: nếu bạn không sử dụng chuyển đổi sau khi đặt hàng trong khi xóa, thì bạn sẽ mất các tham chiếu bạn cần để xóa các cây con.


Wikipedia kể từ ngày 10 tháng 11 năm 2019 đã thay đổi và mô tả đầu tiên cũng thuộc về Post-Order, điều này gây nhầm lẫn. Đó là lý do tôi kết thúc ở đây, tìm kiếm một nguồn thông tin khác.
whoan

5

Quan điểm của việc có các thuật toán khác nhau để đối phó với cây nhị phân là không làm mọi thứ với cây. Ở cấp độ trừu tượng này, một đơn hàng phần lớn tốt như bất kỳ đơn hàng nào khác, vì bạn chỉ nhận được các biểu tượng trừu tượng ngoài quy trình.

Nhưng cây thường được sử dụng để đại diện cho những thứ thú vị và điều đó có thể tạo ra sự khác biệt lớn trong kết quả. Chẳng hạn, nếu các nút đại diện cho các trạng thái tìm kiếm trong một tìm kiếm hoàn chỉnh thông qua một miền lớn (thậm chí có thể là một miền vô hạn), việc giảm dần trước so với xử lý trước không chỉ xác định theo thứ tự kết quả được tìm thấy, thậm chí có thể xác định liệu bạn có bao giờ tìm thấy bất kỳ giải pháp nào cả . Điểm dễ thấy nhất với các miền vô hạn: nếu bạn hạ xuống một cách vô thức, bạn có thể bỏ qua một giải pháp nằm khá cao trên cây, đơn giản là vì bạn đã rẽ nhầm. Nhưng trong thực tế, vì bộ nhớ và đĩa cũng là hữu hạn, điều này thậm chí áp dụng cho các miền đơn giản là rất lớn thay vì thực sự vô hạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.