Tôi có một danh sách các mục trong một hệ thống phân cấp và tôi đang cố phân tích danh sách này thành một hệ thống phân cấp thực tế của các đối tượng. Tôi đang sử dụng modified pre-order tree traversal để lưu trữ/lặp lại thông qua danh sách này và vì vậy những gì tôi có là một tập con của cây, bao gồm tất cả trẻ em, được sắp xếp theo giá trị "trái" của chúng.Xây dựng các đối tượng phân cấp từ danh sách phẳng của cha/con
Ví dụ, với cây:
- Mục A
- mục A.1
- mục A.2
- mục A.2.2
- mục B
- mục B.1
- mục C
tôi nhận được danh sách:
- Mục A, Mục A.1, khoản A.2, Mục A.2.2, Mục B, Mục B.1, Mục C
(Đây là thứ tự của giá trị "bên trái" từ cài đặt cây đã được sửa đổi trước đó).
Những gì tôi muốn làm là phân tích này thành các đối tượng có chứa các cấu trúc thực tế của cây, ví dụ:
Class TreeObject {
String Name;
Guid ID;
Guid ParentID;
List<TreeObject> Children;
}
Danh sách phẳng được trả về như một Danh sách TreeObjects - và mỗi TreeObject có thuộc tính cho ID , ParentID, Trái và Phải. Những gì tôi đang tìm kiếm là một chức năng:
List<TreeObject> FlatToHeirarchy(List<TreeObject> list);
lấy danh sách phẳng và trả về danh sách lồng nhau.
Nói cách khác:
List<TreeObject> flatSet = LoadTreeObjectsFromDatabase();
// flatSet.count == 7; flatSet(0).Children == null
List<TreeObject> nestedSet = FlatToHeirarchy(flatSet);
// nestedSet.count == 3; nestedSet(0).Children.count == 2
Tôi đang ở một mất mát như thế nào để làm điều này - theo dõi của cha mẹ, và có thể đối phó với một bước nhảy lớn hơn (ví dụ, khoản A.2.2 -> mục B).
Chỉnh sửa: Tôi đang tìm một giải pháp không brute-force ở đây (ví dụ, không lặp lại nhiều lần, di chuyển các mục vào nút con, cho đến khi chỉ còn cha mẹ cấp cao nhất). Tôi đoán có một phương pháp thanh lịch có thể lặp lại một lần và chỉ cần đặt các mục nếu cần.
Hãy nhớ rằng, chúng luôn theo thứ tự phân cấp (vì tôi đang sử dụng MPTT), vì vậy một mục nhất định sẽ luôn là con hoặc anh chị em của mục trước đó hoặc ít nhất chia sẻ một phụ huynh với mục trước . Nó sẽ không bao giờ đến một nơi khác trong cây.
Điều này có nghĩa việc lưu trữ của bạn ParentID và các giá trị trái và phải cho mỗi nút trong db? –