v
Зеркало из https://github.com/vlang/v
1// Binary Search Tree example by @SleepyRoy
2
3struct Empty {}
4
5struct Node[T] {
6value T
7left Tree[T]
8right Tree[T]
9}
10
11type Tree[T] = Empty | Node[T]
12
13// return size(number of nodes) of BST
14fn (tree Tree[T]) size[T]() int {
15return match tree {
16Empty { 0 }
17Node[T] { 1 + tree.left.size() + tree.right.size() }
18}
19}
20
21// insert a value to BST
22fn (tree Tree[T]) insert[T](x T) Tree[T] {
23return match tree {
24Empty {
25Node[T]{x, tree, tree}
26}
27Node[T] {
28if x == tree.value {
29tree
30} else if x < tree.value {
31Node[T]{
32...tree
33left: tree.left.insert(x)
34}
35} else {
36Node[T]{
37...tree
38right: tree.right.insert(x)
39}
40}
41}
42}
43}
44
45// whether able to find a value in BST
46fn (tree Tree[T]) search[T](x T) bool {
47return match tree {
48Empty {
49false
50}
51Node[T] {
52if x == tree.value {
53true
54} else if x < tree.value {
55tree.left.search(x)
56} else {
57tree.right.search(x)
58}
59}
60}
61}
62
63// find the minimal value of a BST
64fn (tree Tree[T]) min[T]() T {
65return match tree {
66Empty {
67T(1e9)
68}
69Node[T] {
70if tree.value < tree.left.min() {
71tree.value
72} else {
73tree.left.min()
74}
75}
76}
77}
78
79// delete a value in BST (if nonexistent do nothing)
80fn (tree Tree[T]) delete[T](x T) Tree[T] {
81return match tree {
82Empty {
83tree
84}
85Node[T] {
86if tree.left !is Empty && tree.right !is Empty {
87if x < tree.value {
88Node[T]{
89...tree
90left: tree.left.delete(x)
91}
92} else if x > tree.value {
93Node[T]{
94...tree
95right: tree.right.delete(x)
96}
97} else {
98Node[T]{
99...tree
100value: tree.right.min()
101right: tree.right.delete(tree.right.min())
102}
103}
104} else if tree.left !is Empty {
105if x == tree.value {
106tree.left
107} else {
108Node[T]{
109...tree
110left: tree.left.delete(x)
111}
112}
113} else {
114if x == tree.value {
115tree.right
116} else {
117Node[T]{
118...tree
119right: tree.right.delete(x)
120}
121}
122}
123}
124}
125}
126
127fn main() {
128mut tree := Tree[f64](Empty{})
129vals := [0.2, 0.0, 0.5, 0.3, 0.6, 0.8, 0.9, 1.0, 0.1, 0.4, 0.7]
130for i in vals {
131tree = tree.insert(i)
132}
133println('[1] after insertion tree size is ${tree.size()}') // 11
134del_vals := [-0.3, 0.0, 0.3, 0.6, 1.0, 1.5]
135for i in del_vals {
136tree = tree.delete(i)
137}
138print('[2] after deletion tree size is ${tree.size()}, ') // 7
139print('and these elements were deleted: ') // 0.0 0.3 0.6 1.0
140for i in vals {
141if !tree.search(i) {
142print('${i} ')
143}
144}
145println('')
146}
147