Làm thế nào tôi có thể xây dựng một cây được sắp xếp theo thứ tự inorder và preorder? Tôi chỉ đang tìm một thuật toán hiệu quả.Xây dựng một cây
Trả lời
Bản sao trắng trợn và dán từ Sun's (Oracle now, I guess...) forum:
Câu hỏi:
Ai có thể giúp tôi làm thế nào để xây dựng cây nhị phân từ inorder và traversals postorder, tôi chỉ muốn biết các thuật toán để rằng tôi có thể áp dụng nó.Trả lời:
Hãyp_1
,p_2
...
p_n
là traversal postorder và đểi_1
,i_2
...
i_n
là traversal inorder. Từ quá trình truyền tải thứ tự, chúng ta biết rằng gốc của cây làp_n
. Tìm phần tử này trong quá trình truyền tải theo thứ tự, giả sửi_1
,i_2
...
i_k-1
p_n
i_k+1
...
i_n
. Từ quá trình truyền tải theo thứ tự, chúng tôi tìm thấy tất cả các phần tử trong nhánh trái, tức lài_1
,i_2
...
i_k-1
và ở bên phải, tức lài_k+1
...
i_n
tương ứng.Xóa phần tử
p_n
(và phần tửi_k
==
p_n
). Tìm các yếu tố ngoài cùng bên phảip_j
trongp_1
,p_2
...
p_j
...
p_n-1
nơip_j
là một yếu tố trongi_1
,i_2
...i_k-1
. Đây là gốc của cây con trái của cây gốc. Chiap_1
,p_2
...
p_j
vàp_j+1
...p_n-1
vài_1
,i_2
...
i_k-1
vài_k+1
...
i_n
. Bây giờ bạn có hai chuỗi đại diện cho thứ tự postorder và inorder traversal của hai subtrees của cây ban đầu là .
Tác giả: JosAH.
Tôi đã triển khai thuật toán một lần theo hướng dẫn của Jos 'và nó hoạt động hoàn hảo!
Mất quá nhiều thời gian để tìm phần tử ngoài cùng bên phải p_j trong p_1 ~ p_n-1 trong khi nó cũng nằm trong i_1 ~ i_k-1. Phải mất thời gian O (n^2). Thực tế, sau khi xóa p_n và tìm vị trí của nó trong i_1 ~ i_n. Chúng ta đã biết vị trí của p_j. Điều này là do chúng tôi đã biết số lượng các nút trong cây con trái và phải của nó, có thể nhận được bằng cách đếm các phần tử sau p_n trong i_1 ~ i_n. Bằng cách này, chúng ta có thể dễ dàng tìm thấy nơi để chia p_1 ~ p_n-1 – ibread
Vì đây là bài tập về nhà, tôi sẽ không cung cấp cho bạn câu trả lời đầy đủ, nhưng hy vọng, đủ để giúp bạn di chuyển.
Hãy tưởng tượng bạn có quá trình truyền tải trước, ví dụ: this cây.
Giao lộ cung cấp cho bạn 2-7-2-6-5-11-5 ... v.v. Lưu ý rằng 5 thực sự là con phải của gốc.Rõ ràng, bạn không thể nói rằng chỉ cần nhìn vào các con số, do đó, hoặc là bạn sẽ được thông báo về cấu trúc của cây, hoặc bạn cần phải lưu trữ một số dữ liệu bổ sung (ví dụ, liệu một nút có phải là trái hay không?). ví dụ như trẻ em hoặc trẻ em phải).
Phân tích cú pháp cây chỉ đơn giản là một hàm đệ quy lấy lượt duyệt trước làm đầu vào (suy nghĩ về phạm vi của bạn khi bạn chuyển đầu vào). Như tôi đã đề cập trước đó, quá trình truyền tải đơn đặt hàng trước của bạn phải có một số dữ liệu bổ sung được đính kèm.
Hiệu quả:
cân nhắc bao nhiêu lần mỗi nút được truy cập khi bạn xây dựng cây này, mà còn xem xét các hoạt động của đọc đầu vào. Có cách nào để tổ chức lại đầu vào nhanh hơn bạn có thể xây dựng cây không? Bạn sẽ phải sử dụng cấu trúc nào nếu bạn cần thao tác dữ liệu.
Thứ tự: Bạn sẽ cần ý tưởng tương tự để giúp bạn vượt qua nó, vì vậy tôi sẽ không đề cập đến nó. Tôi chắc chắn một người khác sẽ, nếu bạn đang tuyệt vọng cho nó.
- 1. ANTLR4: Xây dựng cây
- 2. Xây dựng cây biểu thức nhị phân
- 3. PHP/MySQL xây dựng trình đơn cây
- 4. Xây dựng một cây chung với thừa kế
- 5. Cây được xây dựng với Twitter Bootstrap và Backbone.js?
- 6. gây tử vong: git-write-tree: lỗi xây dựng cây
- 7. Đệ quy xây dựng cây JSON phân cấp?
- 8. Xây dựng 'phẳng' thay vì 'cây' biểu thức LINQ
- 9. Xây dựng cây tìm kiếm nhị phân cân bằng
- 10. Xây dựng cây từ khóa bằng cách sử dụng perl
- 11. Xây dựng cây nhị phân cân bằng với foldr
- 12. thư viện javascript để xây dựng cây nút thứ bậc
- 13. Cách dễ nhất để xây dựng một cây từ danh sách tổ tiên
- 14. Xây dựng một cây biểu thức động để lọc trên thuộc tính bộ sưu tập
- 15. Xây dựng một cây xác suất bằng cách sử dụng php?
- 16. Làm thế nào tôi có thể xây dựng một cây gia đình với Perl?
- 17. Xây dựng một cây bằng cách sử dụng danh sách các đối tượng
- 18. xây dựng một dự án
- 19. Sử dụng Reflection để xây dựng một Class (để xây dựng một lớp FileHelper động)
- 20. Viết một bộ ghép Z80 - lexing ASM và xây dựng một cây phân tích bằng cách sử dụng bố cục?
- 21. Làm thế nào để xây dựng một cây biểu thức năng động AND OR trong một vòng lặp
- 22. Xây dựng với phần xây dựng với Cython
- 23. Xây dựng một bộ lắp ráp
- 24. Xây dựng một đại biểu từ MethodInfo?
- 25. Xây dựng một CMS trong ASP.NET MVC
- 26. Gradle chỉ xây dựng một mô-đun
- 27. Xây dựng một JNI DLL bằng MINGW
- 28. Xây dựng một DynamoDBMarshalling chung cho enums
- 29. không thể xây dựng một Dockerfile cụ
- 30. Xây dựng một dll .NET để WP7
Vâng, đệ quy. Tôi hy vọng bạn không phải là sinh viên của tôi. –
Cần làm rõ một số. Định dạng của dữ liệu đầu vào là gì? Cây có cân bằng không? Những gì bạn có nghĩa là hiệu quả (Ordo (x), hoặc chỉ "không khủng khiếp điên"). Cấu trúc bạn muốn xây dựng là gì? Cây làm đối tượng liên kết hoặc cây bằng mảng. – ron
http://forums.devshed.com/software-design-43/finding-binary-tree-from-inorder-and-preorder-traversals-151147.html – Heinzi