2011-10-17 34 views
6

Tôi cần thuật toán truyền tải cây cho các cây tùy ý trong cả thứ tự Traversal thứ nhất và thứ nhất. Phần khó khăn là tôi cần để có thể bắt đầu từ một nút tùy ý và tiếp tục cho đến khi một nút cụ thể khác được duyệt qua.Duyệt qua một cấu trúc cây chung bắt đầu từ một nút tùy ý trong C#

Bây giờ, tôi có thể sử dụng bất kỳ thuật toán thông thường nào và bỏ qua các nút được duyệt qua cho đến khi tôi nhấn nút bắt đầu và tiếp tục cho đến nút kết thúc (mà hiện tại tôi đang thực hiện) nhưng điều này rất xấu và không hiệu quả.

Bất kỳ đề xuất nào, vui lòng.

CẬP NHẬT: Mỗi nút của tôi có một id được liên kết với chúng. Trong một số trường hợp, tôi có các tham chiếu nút bắt đầu và kết thúc để bắt đầu. Trong các trường hợp khác, tôi có hai Id, tôi kiểm tra xem nút đã cho là nút bắt đầu hay nút kết thúc bằng cách kiểm tra các id của chúng. Tôi sử dụng traversal độ sâu đầu tiên để tìm nút bắt đầu. Cả hai nút bắt đầu và kết thúc đều có thể ở bất kỳ đâu trong cấu trúc phân cấp. Tôi hy vọng ai đó có thể đưa ra một ý tưởng cho trường hợp tôi đã đưa ra các tham chiếu đến cả nút start-end và nút kết thúc. BTW, các nút trong cây là thực sự được sắp xếp theo một thứ tự sắp xếp, bắt đầu từ 0 cho mỗi sub-node của một node và có một nút gốc

+1

Bạn sẽ tìm thấy nút bắt đầu trong cây như thế nào mà không vượt qua nó? – BrokenGlass

+0

Bạn đã có * nút * chưa? Nếu không, bạn cần một datastructure thứ hai để tăng tốc tìm kiếm các nút start/end. – harold

+0

Vui lòng chỉ định cách cấu trúc cây của bạn. Có bất kỳ thứ tự sắp xếp nào được thực hiện không? Các nút liên quan như thế nào? –

Trả lời

2

Tôi nghĩ những gì bạn đang làm là cách hiệu quả nhất để làm. Đặc biệt là nếu bạn đang làm việc với cây tùy ý.

Bạn được cung cấp một cây tùy ý và bạn cần phải tìm nút để bắt đầu truyền tải. Vì không có phân cấp (nghĩa là nó không phải là cây nhị phân), bạn sẽ phải quét các nút (bạn có thể sẽ quét hơn một nửa các nút nếu nút đã cho là nút lá hoặc nếu nút không nằm trong cây bạn sẽ phải tìm kiếm toàn bộ cây) cho đến khi bạn tìm thấy nút để bắt đầu. Một khi bạn tìm thấy nút, bạn có thể bắt đầu DF Traversal hoặc BF Traversal của bạn.

Tôi không thấy bất kỳ tối ưu hóa nào bạn có thể làm.

0

Thay vì

Traverse(RootNode, StartNode, EndNode) 

đèo nút bắt đầu dưới dạng gốc

Traverse(StartNode, EndNode) 

Tuy nhiên, nếu bạn muốn trả lại các nút không phải là con của nút bắt đầu, bạn sẽ phải tiếp tục sử dụng phương pháp hiện tại của mình.

0

Nếu bạn sẽ phải trả lời nhiều truy vấn không liên quan và bạn cần cung cấp đường dẫn (thay vì chỉ nói câu hỏi đó có tồn tại hay không) thì bạn không thể làm tốt hơn những gì bạn có bây giờ AFAIK. Mặt khác, nếu bạn mong đợi nhiều truy vấn liên quan đến một số lượng nhỏ các nút cụ thể (ví dụ: các đường dẫn từ A đến B, C, D, E, F và G là gì?) Thì trước tiên bạn có thể tính toán các minimum spanning tree từ nút đó và làm cho BFS của bạn hiệu quả hơn.

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