2009-09-25 29 views
5

Có bất kỳ mô-đun hoặc chức năng nào để xử lý cây không? Tôi có một loại trông như thế này:OCaml: Các chức năng của cây

type t = 
     Leaf of string (* todo: replace with 'a *) 
     | Node of string * t list 

và tôi đang đấu tranh để làm chèn, loại bỏ các subtrees vv

Tôi đã sử dụng googles nhưng không thể tìm thấy bất cứ điều gì.

Trả lời

3

Đọc phần cài đặt mô-đun Đặt trong nguồn của thư viện chuẩn OCaml. Chúng được thực hiện với cây nhị phân, chỉ phức tạp hơn một chút so với của bạn.

(Tôi muốn giới thiệu bạn bắt đầu với cây nhị phân thay vì có một danh sách các trẻ em như bạn dường như đã được định nghĩa)

+0

vâng, nhưng tôi đang sử dụng những cây này để thực hiện cú pháp câu, vì vậy tôi không thể chỉ ném các giá trị trong đó. họ cần phải duy trì trật tự, và tôi đã hy vọng để thiết lập thứ tự này chỉ bằng cách tạo ra cây đúng cách, mặc dù tôi đoán tôi có thể sử dụng một loại bao bọc với cả một số và từ chính nó ... –

+1

Bạn * có thể * thiết lập thứ tự tạo cây đúng cách. Trên thực tế, mô-đun Đặt duy trì các yếu tố của cây theo thứ tự (yếu tố thấp nhất ở hậu duệ trái nhất), vì vậy tôi vẫn nghĩ đó là nguồn cảm hứng tốt. –

0

Trên thực tế nó phụ thuộc vào cách bạn muốn cây của bạn để làm việc, ví dụ nếu có trật tự giữa các yếu tố và như vậy.

Nếu không, bạn có thể sử dụng các thuật toán đã biết trên cây, nếu bạn có ý tưởng về nó bằng các ngôn ngữ khác C hoặc Java chẳng hạn, tôi có thể dịch nó sang OCAML.

3

Trong quá khứ, tôi đã sử dụng ocamlgraph. Đây không phải là một lib tầm thường để sử dụng, nhưng nếu bạn cần phải chèn các nút và thay đổi đường dẫn, đó có thể là lừa, tôi đã không bao giờ được sử dụng trong một bối cảnh cây ... mặc dù ...

Và trích xuất từ tài liệu ngôn ngữ:

Cách sử dụng phổ biến nhất của các loại biến thể là để mô tả dữ liệu đệ quy cấu trúc. Hãy xem xét ví dụ loại cây nhị phân:

#type 'a btree = Empty | Node of 'a * 'a btree * 'a btree;; 
type 'a btree = Empty | Node of 'a * 'a btree * 'a btree 

Định nghĩa này lần đọc như sau: một cây nhị phân chứa giá trị của loại 'một (một loại tùy ý) là một trong hai trống rỗng, hoặc là một nút có chứa một giá trị loại 'a và hai subtrees cũng chứa các giá trị thuộc loại' a, có nghĩa là, hai 'một btree.

Thao tác trên cây nhị phân là được biểu diễn tự nhiên dưới dạng đệ quy các chức năng theo cùng cấu trúc làm định nghĩa loại chính nó. Đối với dụ, đây là chức năng thực hiện tra cứu và chèn trong cây nhị phân ra lệnh (yếu tố tăng từ trái sang phải):

#let rec member x btree = 
    match btree with 
    Empty -> false 
    | Node(y, left, right) -> 
     if x = y then true else 
     if x < y then member x left else member x right;; 
val member : 'a -> 'a btree -> bool = <fun> 

#let rec insert x btree = 
    match btree with 
    Empty -> Node(x, Empty, Empty) 
    | Node(y, left, right) -> 
     if x <= y then Node(y, insert x left, right) 
       else Node(y, left, insert x right);; 
val insert : 'a -> 'a btree -> 'a btree = <fun> 

Hope this helps

+0

Nút phải được định nghĩa ở đâu đó? Tôi thấy bạn đang sử dụng một số loại hàm tạo cho Node khi chèn, nó hoạt động như thế nào và nó được triển khai ở đâu? Hoặc là Node (x, trái, phải) chỉ khớp mẫu? Nếu vậy, bạn có thể giải thích cú pháp đó nhiều hơn một chút không? Cảm ơn, bài đăng của bạn rất hữu ích. –

+0

Ngoài câu trả lời của @ LB40, đây là loại bỏ: http://geck1.blogspot.com/2014/02/ocaml-review-day-4-binary-tree-ops.html – BRS

0

Có một datatype Ptree Matt McDonnell làm những gì bạn cần, tôi nghĩ vậy.

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