Hầu như mọi dự án có một số mô hình hoặc tài liệu có thể chỉnh sửa sẽ có cấu trúc phân cấp cho nó. Nó có thể có ích để thực hiện 'nút phân cấp' như là một lớp cơ sở cho các thực thể khác nhau. Thông thường danh sách liên kết (anh chị em, mô hình thứ 2) là cách tự nhiên mà nhiều thư viện lớp phát triển, tuy nhiên trẻ em có thể thuộc nhiều loại khác nhau và có lẽ " mô hình đối tượng " không phải là những gì chúng ta xem xét khi nói về cây nói chung.
Triển khai yêu thích của tôi về một cây (nút) của mô hình đầu tiên của bạn là một lớp lót (trong C #):
public class node : List<node> { /* props go here */ }
Kế thừa từ một Danh sách chung về loại của riêng bạn (hoặc kế thừa từ bất kỳ bộ sưu tập chung nào khác của bạn). Đi bộ có thể theo một hướng: hình thành gốc xuống (vật phẩm không biết cha mẹ của chúng).
Cây chỉ có cha mẹ
Một mô hình khác mà bạn không đề cập đến là mô hình mà mọi đứa trẻ đều có liên quan đến cha mẹ của nó:
null
|
+---------+---------------------------------+
| parent |
| root |
+-------------------------------------------+
| | |
+---------+------+ +-------+--------+ +--+-------------+
| parent | | parent | | parent |
| node 1 | | node 2 | | node 3 |
+----------------+ +----------------+ +----------------+
Đi bộ cây này chỉ có thể theo cách khác, thông thường tất cả các nút này sẽ được lưu trữ trong một bộ sưu tập (mảng, hashtable, dictionary, v.v.) và một nút sẽ được định vị bằng cách tìm kiếm bộ sưu tập theo các tiêu chí khác ngoài vị trí phân cấp trong cây thường không có tầm quan trọng chính.
Những cây chỉ dành cho cha mẹ thường được nhìn thấy trong các ứng dụng cơ sở dữ liệu. Thật dễ dàng để tìm thấy các phần tử con của một nút với các câu lệnh "CHỌN * WHERE ParentId = x". Tuy nhiên, chúng tôi hiếm khi tìm thấy chúng được chuyển đổi thành các đối tượng lớp nút cây như vậy. Trong các ứng dụng statefull (máy tính để bàn), chúng có thể được gói vào các điều khiển nút cây hiện có. Trong các ứng dụng phi trạng thái (web) thậm chí có thể không xảy ra. Tôi đã thấy các công cụ trình tạo lớp ánh xạ ORM đưa ra các lỗi tràn ngăn xếp khi tạo các lớp cho các bảng có mối quan hệ với chính chúng (cười khúc khích), vì vậy có lẽ những cây này không phổ biến lắm.
cây điều hướng hai chiều
Tuy nhiên, trong hầu hết các trường hợp thực tế, thật thuận tiện để có những điều tốt nhất của cả hai thế giới. Các nút có một danh sách trẻ em và ngoài ra biết cha mẹ của chúng: cây điều hướng hai chiều.
null
|
+--------------------+--------------------+
| parent |
| root |
| child1 child2 child3 |
+--+------------------+----------------+--+
| | |
+---------+-----+ +-------+-------+ +---+-----------+
| parent | | parent | | parent |
| node1 | | node2 | | node3 |
| child1 child2 | | child1 child2 | | child1 child2 |
+--+---------+--+ +--+---------+--+ +--+---------+--+
| | | | | |
Điều này mang lại nhiều khía cạnh hơn để xem xét:
- Nơi để thực hiện liên kết và hủy liên kết của cha mẹ?
- hãy để logic kinh doanh quan tâm và bỏ khía cạnh ra khỏi nút (họ sẽ quên!)
- các nút có các phương thức để tạo trẻ em (không cho phép đặt hàng lại) (lựa chọn microsofts trong triển khai DOM System.Xml.XmlDocument của chúng, điều này gần như khiến tôi phát điên khi lần đầu tiên gặp phải nó)
- Các nút lấy cha mẹ trong hàm tạo của chúng (không cho phép đặt hàng lại)
- trong tất cả các phương thức add (), insert () và remove () và sự quá tải của các nút (thường là lựa chọn của tôi)
- Kiên trì
- Cách đi trên cây khi vẫn tồn tại (ví dụ: bỏ liên kết cha mẹ)
- Làm cách nào để xây dựng lại liên kết hai chiều sau khi hủy tuần tự hóa (đặt lại tất cả các bậc cha mẹ thành một hành động sau khử lưu huỳnh)
- Thông báo
- Cơ chế tĩnh (cờ IsDenty), xử lý đệ quy trong thuộc tính?
- Các sự kiện, bong bóng qua cha mẹ, qua trẻ em hoặc cả hai cách (ví dụ như xem xét việc bơm tin nhắn windows).
Bây giờ để trả lời câu hỏi , cây điều hướng hai chiều có xu hướng (trong sự nghiệp và lĩnh vực của tôi cho đến nay) được sử dụng rộng rãi nhất. Ví dụ là triển khai microsofts của System.Windows.Forms.Control hoặc System.Web.UI.Control trong khung .Net, nhưng mọi triển khai DOM (Mô hình đối tượng tài liệu) sẽ có các nút biết cha mẹ của chúng cũng như liệt kê của con cái họ. Lý do: dễ sử dụng hơn dễ thực hiện. Ngoài ra, đây thường là các lớp cơ sở cho các lớp cụ thể hơn (XmlNode có thể là cơ sở của các lớp Tag, Attribution và Text) và các lớp cơ sở này là nơi tự nhiên để đặt các kiến trúc xử lý sự kiện và tuần tự hóa chung.
Cây nằm ở trung tâm của nhiều kiến trúc, và có thể điều hướng tự do có nghĩa là có thể thực hiện các giải pháp nhanh hơn.