2010-04-05 39 views
17

Bất kỳ ai cũng có sẵn sàng thực hiện thuật toán truyền tải đảo ngược đầu tiên trong C#?Chiều rộng đảo chiều Lần truyền đầu tiên trong C#

Bằng cách đảo chiều ngang đầu tiên, ý tôi là thay vì tìm kiếm một cây bắt đầu từ một nút chung, tôi muốn tìm kiếm cây từ phía dưới và dần dần hội tụ thành một nút chung.

Hãy xem hình dưới đây, đây là sản phẩm của một traversal Chiều rộng đầu tiên: alt text

Ở chiều ngược lại bề rộng traversal đầu tiên của tôi, 9, 10, 1112 sẽ là vài nút đầu tiên được tìm thấy (thứ tự trong số đó không quan trọng vì chúng đều là thứ tự đầu tiên). 5, 6, 78 là hai nút thứ hai được tìm thấy, v.v. 1 sẽ là nút cuối cùng được tìm thấy.

Bất kỳ ý tưởng hoặc con trỏ nào?

Chỉnh sửa: Thay đổi "Chiều rộng tìm kiếm đầu tiên" đến "Chiều rộng đầu tiên traversal" để làm rõ các câu hỏi

+2

Làm thế nào để bạn tìm thấy tất cả các lá mà không đi qua toàn bộ cây? – Nifle

+1

Không cần biết thêm về vấn đề này. Thông thường có thể bắt đầu bằng một nút và quạt, như tìm kiếm theo chiều rộng, tìm kiếm chiều sâu, làm sâu sắc lặp lại, v.v. Làm thế nào chúng ta có thể biết một ưu tiên 9, 10, 11 và 12 là ba bước nhảy từ 1? –

+0

Bạn đã sử dụng cái gì để tạo hình ảnh đó? –

Trả lời

7

Chạy BFS bình thường từ rootNode và để depth[i] = linked list of nodes with depth i. Vì vậy, đối với ví dụ của bạn, bạn sẽ có:

depth[1] = {1}, depth[2] = {2, 3, 4} etc.. Bạn có thể xây dựng điều này với một tìm kiếm BFS đơn giản. Sau đó in tất cả các nút trong depth[maxDepth], sau đó những người trong depth[maxDepth - 1], vv

Độ sâu của một nút i bằng với chiều sâu của nút cha của nó + 1. Độ sâu của nút gốc có thể được coi là 1 hoặc 0.

16

Sử dụng một sự kết hợp của một chồng và hàng đợi.

Làm BFS 'bình thường' bằng hàng đợi (mà tôi cho là bạn biết đã làm) và tiếp tục đẩy các nút trên ngăn xếp khi bạn gặp chúng.

Sau khi thực hiện với BFS, ngăn xếp sẽ chứa thứ tự BFS ngược lại.

Các vấn đề liên quan