parent
021df22e8a
commit
c5c2f7f3db
@ -0,0 +1,161 @@
|
|||||||
|
module Task6
|
||||||
|
|
||||||
|
open System
|
||||||
|
|
||||||
|
type BinaryTree =
|
||||||
|
| Empty
|
||||||
|
| Node of string * BinaryTree * BinaryTree
|
||||||
|
|
||||||
|
let empty = Empty
|
||||||
|
|
||||||
|
let rec insert value tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> Node(value, Empty, Empty)
|
||||||
|
| Node(v, left, right) ->
|
||||||
|
if value < v then
|
||||||
|
Node(v, insert value left, right)
|
||||||
|
elif value > v then
|
||||||
|
Node(v, left, insert value right)
|
||||||
|
else
|
||||||
|
tree
|
||||||
|
|
||||||
|
let rec contains value tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> false
|
||||||
|
| Node(v, left, right) ->
|
||||||
|
if value = v then true
|
||||||
|
elif value < v then contains value left
|
||||||
|
else contains value right
|
||||||
|
|
||||||
|
let rec findMin tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> None
|
||||||
|
| Node(v, Empty, _) -> Some v
|
||||||
|
| Node(_, left, _) -> findMin left
|
||||||
|
|
||||||
|
let rec findMax tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> None
|
||||||
|
| Node(v, _, Empty) -> Some v
|
||||||
|
| Node(_, _, right) -> findMax right
|
||||||
|
|
||||||
|
let rec remove value tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> Empty
|
||||||
|
| Node(v, left, right) ->
|
||||||
|
if value < v then
|
||||||
|
Node(v, remove value left, right)
|
||||||
|
elif value > v then
|
||||||
|
Node(v, left, remove value right)
|
||||||
|
else
|
||||||
|
match left, right with
|
||||||
|
| Empty, Empty -> Empty
|
||||||
|
| Empty, right -> right
|
||||||
|
| left, Empty -> left
|
||||||
|
| left, right ->
|
||||||
|
match findMin right with
|
||||||
|
| Some minValue ->
|
||||||
|
Node(minValue, left, remove minValue right)
|
||||||
|
| None -> left
|
||||||
|
|
||||||
|
let rec inOrder tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> []
|
||||||
|
| Node(v, left, right) ->
|
||||||
|
(inOrder left) @ [v] @ (inOrder right)
|
||||||
|
|
||||||
|
let rec preOrder tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> []
|
||||||
|
| Node(v, left, right) ->
|
||||||
|
[v] @ (preOrder left) @ (preOrder right)
|
||||||
|
|
||||||
|
let rec postOrder tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> []
|
||||||
|
| Node(v, left, right) ->
|
||||||
|
(postOrder left) @ (postOrder right) @ [v]
|
||||||
|
|
||||||
|
let rec height tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> 0
|
||||||
|
| Node(_, left, right) ->
|
||||||
|
1 + max (height left) (height right)
|
||||||
|
|
||||||
|
let rec size tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> 0
|
||||||
|
| Node(_, left, right) ->
|
||||||
|
1 + (size left) + (size right)
|
||||||
|
|
||||||
|
let rec map f tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> Empty
|
||||||
|
| Node(v, left, right) ->
|
||||||
|
Node(f v, map f left, map f right)
|
||||||
|
|
||||||
|
let rec fold f acc tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> acc
|
||||||
|
| Node(v, left, right) ->
|
||||||
|
let leftAcc = fold f acc left
|
||||||
|
let nodeAcc = f leftAcc v
|
||||||
|
fold f nodeAcc right
|
||||||
|
|
||||||
|
let rec filter predicate tree =
|
||||||
|
match tree with
|
||||||
|
| Empty -> Empty
|
||||||
|
| Node(v, left, right) ->
|
||||||
|
let filteredLeft = filter predicate left
|
||||||
|
let filteredRight = filter predicate right
|
||||||
|
if predicate v then
|
||||||
|
Node(v, filteredLeft, filteredRight)
|
||||||
|
else
|
||||||
|
let leftList = inOrder filteredLeft
|
||||||
|
let rightList = inOrder filteredRight
|
||||||
|
let combinedList = leftList @ rightList
|
||||||
|
List.fold (fun acc x -> insert x acc) Empty combinedList
|
||||||
|
|
||||||
|
let fromList lst =
|
||||||
|
List.fold (fun acc x -> insert x acc) Empty lst
|
||||||
|
|
||||||
|
let toList tree = inOrder tree
|
||||||
|
|
||||||
|
[<EntryPoint>]
|
||||||
|
let main argv =
|
||||||
|
let tree1 = empty
|
||||||
|
|> insert "dog"
|
||||||
|
|> insert "cat"
|
||||||
|
|> insert "elephant"
|
||||||
|
|> insert "bird"
|
||||||
|
|> insert "fish"
|
||||||
|
|
||||||
|
printfn "Tree contents (in-order): %A" (inOrder tree1)
|
||||||
|
printfn "Tree contents (pre-order): %A" (preOrder tree1)
|
||||||
|
printfn "Tree contents (post-order): %A" (postOrder tree1)
|
||||||
|
|
||||||
|
printfn "Contains 'cat': %b" (contains "cat" tree1)
|
||||||
|
printfn "Contains 'zebra': %b" (contains "zebra" tree1)
|
||||||
|
|
||||||
|
printfn "Min value: %A" (findMin tree1)
|
||||||
|
printfn "Max value: %A" (findMax tree1)
|
||||||
|
|
||||||
|
printfn "Tree height: %d" (height tree1)
|
||||||
|
printfn "Tree size: %d" (size tree1)
|
||||||
|
|
||||||
|
let tree2 = remove "cat" tree1
|
||||||
|
printfn "After removing 'cat': %A" (inOrder tree2)
|
||||||
|
|
||||||
|
let upperTree = map (fun s -> s.ToUpper()) tree1
|
||||||
|
printfn "Uppercase tree: %A" (inOrder upperTree)
|
||||||
|
|
||||||
|
let longWords = filter (fun s -> s.Length > 3) tree1
|
||||||
|
printfn "Words longer than 3 chars: %A" (inOrder longWords)
|
||||||
|
|
||||||
|
let wordCount = fold (fun acc _ -> acc + 1) 0 tree1
|
||||||
|
printfn "Word count using fold: %d" wordCount
|
||||||
|
|
||||||
|
let listTree = fromList ["apple"; "banana"; "cherry"; "date"]
|
||||||
|
printfn "Tree from list: %A" (toList listTree)
|
||||||
|
|
||||||
|
0
|
@ -0,0 +1,8 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
Loading…
Reference in new issue