1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
use VecDeque;
/// Реализация итератора для нашего дерева.
/// Для полного понимания советую ознакомится с реализацией
/// самого дерева, если вы этого ещё не сделали.
///
/// Для итератора я принял решение использовать
/// std::collections::VecDeque, т.к. он шустрее двусвязного
/// списка (std::collections::LinkedList), а также он может удалять
/// элементы как с конца, так и с начала.
/// В деке мы храним сами элементы, однако менять содержимое
/// итератора нельзя, т.к. может нарушиться логика дерева.
///
/// Для нашего итератора мы используем те же трейты, что и
/// для дерева, а именно:
/// Debug (для вывода на консоль или в файл),
/// Clone (для полного клонирования экземпляра),
/// PartialEq (для сравнения на равенство-неравенство).
/// Добавляем трейт Default для реализации дефолтного
/// итератора. По-умолчанию наш итератор - пустой дек.
/// Добавляем метод new() для нашего итератора.
/// Если честно, то просто по фану :D
/// Делаем наш итератор итератором, а точнее добавляем
/// реализацию трейта Iterator для нашего итератора.
/// Это значит, что наш итератор имеет те же методы,
/// что и все итераторы.
///
/// # Example
/// ```
/// use bintree::iter::TreeIter;
/// use bintree::tree::BinaryTree;
/// use std::iter::FromIterator;
///
/// let mut tree = BinaryTree::from_iter((1..11).step_by(2));
/// let mut tree_iter = tree.into_iter();
///
/// assert_eq!(tree_iter.clone().min().unwrap(), 1);
/// assert_eq!(tree_iter.clone().max().unwrap(), 9);
/// assert_eq!(tree_iter.clone().collect::<Vec<i32>>(), vec![1, 3, 5, 7, 9]);
/// assert_eq!(tree_iter.clone().filter(|x| x % 3 == 0).collect::<Vec<i32>>(), vec![3, 9]);
/// ```