rustH#rustc 1.44.1 (c7087fe00 2020-06-17)stde-447f0e6919e87703coreᝓ-d7ecf429ccc8dc70compiler_builtins齯-4fc9e886634acec6rustc_std_workspace_coreâ榾µr-1a51942af531248calloc䘠-2285fe2f7f9a72eclibcݫύל-c582a1654a681be9unwindǀõ-9499c77410f0cb84cfg_ifij-cb2a1962c04b6646 backtraceI-2bc81dc380687e4brustc_demangleܛ-cb491f3ffc25ac52 backtrace_sysœɟ5-53b5dac028b62d7c hashbrownו-ee4714732ebaf9a3rustc_std_workspace_alloc-e062de0dbb254b6a panic_unwind䒄T-6691a7d28fd5ead65F:\PROGRAMMING\_rust\Structures\BinaryTree\src\lib.rsAw]48m8 ;WT* t   "$&)+-/1357?ACEGIKMOQSUXZ\^`bdfhjmoqsuwz|~۵ɧŐ ;  6F:\PROGRAMMING\_rust\Structures\BinaryTree\src\node.rsՈg{RMS_/3#"PʴƌǫͶƻ6F:\PROGRAMMING\_rust\Structures\BinaryTree\src\knot.rs]w[k@N7;7 bTW8_cprhWUlzRbN/3 Y 3K6I3'"Wc36" Sc?:" R)BK5/!;),+2&,+ eqr294;?6; @^(5& @^(6' 5S/0.342                                                                                                                                                                                                                                                                                            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"""""""""""""""""""""""""""""""""'''''''''''''''''''''''''''''''''''''''''''''(((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))---------------------------........................................00000000000000000000000000000000000000111111111111111111111111111113333333333333333333333333333333333333333333333333334444444̉Ψֆ 7F:\PROGRAMMING\_rust\Structures\BinaryTree\src\tests.rsn4(ٻ(-wׂ7n7 <0 8/ J#$ . -- '5  '5 . 65 .  -  5 '4E - E 4 'B B -  'A$!! ?&  5  )%+   )%+ /  -    )" ((*& ),,-,,-,-, )%$ )h %& + .   777777777777RRRRRRRRRRRRRR77788===>>>>>>>>????????????????????@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEFFFFFFFFGGGGGGGGGGGGHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIJJJJJJJJJJJJKKKKKKKKKKLLLLLLLLLLLLMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOPPPPPPPPPPQQQQQQQQQRSSSSSUUUVVVVVVVVVVVVVVWWWWWWWWWWWWWWWWWXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZ[[[[[[[[[[[[[[[[[[\\\\\\\\\\\\\\\\\\\\\\\]]]]]]]]]]]]]]]]]]]]]]]^^^^^^^^^^^_________``````````aaaaaaaaaabbbbbbbbbbccccccddddddeeeeeeeeffffffffffgggggggggggghhhhhhhhhhiiiiiiiiiiiijjjjjjjjkkkkkkkkllllllllllllmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnnnnnnnnnnnnnnǙp6F:\PROGRAMMING\_rust\Structures\BinaryTree\src\iter.rsY%:f5& nn NmTVR^Flgg*HQZ#0[_ 01!/7-P>0TS!$$MbW[)!#!>*55N\!0P`ied?JPPM#!N+++(#  ooooooooooooooooooooooooooooooooooooooooooooopppppppppppppppppppppppppppppppppppppppppppppppppppppppppqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrssssssssssssssssssssssssssssssssssssssssssssssssssstttttttttttttttttttttttttttttttttttttttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{|||||||||||||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Àŀǀɀˀ݀߀ƃȃʃ̃΃ЃӃՃ׃ڃ܃ރÄńDŽӄՄׄڄ܄ބÅŅȅʅ̅΅Ѕ҅څ܅ޅËŋNjʋ̋΋ыӋՋ׋ً܋ދƌȌʌ̌Ό،ڌ܌ތÍǍɍˍ΍ЍҍՍ׍ڍ܍ލÎŎǎɎ͎ώюԎ֎؎ڎ܎ߎŏǏɏˏ͏ЏҏՏ׏ُۏݏŐǐɐː͐ϐѐӐאِېސÑőǑɑ̑ΑБґԑ֑ؑڑܑyy{}}}~♟Șșʤ6F:\PROGRAMMING\_rust\Structures\BinaryTree\src\tree.rsy|pX\x7qL/KTzm_~x@Wj#3!"3 " Hr9(HS#-1@; psn#&=9# !gO#/0%-)2%M^ek?#&sc`(,:%('" ]O#&))).0UYXL#&"## ![\#&!!!!MNT@]:#&G." NbIU_#''H6)% =^~nuqy2#&@97&'3!S#''H(Je#!$5U*3?#/ –ĖƖȖʖ͖ϖіӖՖזږܖޖ—ėޗĘƘȘʘϘјӘ՘טژܘޘÙƙșʙ̙Ιיٙۙݙߙǚɚ˚͚КҚԚؚ֚ښܚÛǛɛ˛͛ϛӛ՛כٛۛݛߛœĜǜɜ˜͜ϜќӜ՜לٜܜޜÝŝǝɝ˝͝ϝҝԝ֝ٝ۝ݝߝÞŞǞɞ˞͞ϞўԞמٞ۞ݞߞŸğǟɟ˟͟ϟџԟٟ֟۟ޟ ĠƠȠʠ̠ΠѠӠՠנ٠۠ݠߠášǡɡˡ͡ϡѡӡ֡ءڡܡޡ¢ĢƢɢˢ΢ТҢԢ֢آڢܢ£ģƣȣʣ̣ΣУңգף٣ۣݣߣ¤ĤȤʤͤϤѤԤ֤ؤڤܤޤ¥ĥƥɥ˥ͥϥѥӥեץ٥ۥޥ¦ĦƦȦʦ̦ϦѦӦզצ٦ۦݦߦçŧǧɧ˧ΧЧҧԧ֧اڧܧާèŨǨʨͨϨѨӨըר٨©ĩƩɩ˩ͩЩҩԩ֩ة۩ݩߩªĪƪȪ˪ͪϪѪӪժת٪۪ު«īƫȫʫ̫Ϋګܫޫ¬ĬƬɬˬͬϬѬӬ­ĭƭȭʭ̭έЭحڭܭޭîŮɮˮͮϮҮԮ֮خܮޮ¯įƯȯʯ̯ίүկׯٯۯݯ߯ðŰǰɰñűȱʱ̱αбұԱױٱ۱ݱ߱òŲDzɲ˲ͲвҲԲֲزڲܲ޲ôŴǴɴ̴δдҴڴܴ޴·ķƷȷʷ̷Ϸѷӷշ׷ٷܷ߷øŸָظڸܸ߸ܺ޺ĻƻȻʻ̻λлһջ׻ڻܻ޻¼ļƼɼ˼ͼϼҼԼּټۼ޼ýŽǽɽ˽νнҽս׽ٽ۽ݽ߽þƾȾʾ;ϾҾԾؾھܾ߾׃كۃ݃߃„ĄƄȄʄ̄΄фӄՄׄل܄ބӹ컐Ԥыstdnodeknot T default T new ignore  ignore_mut get_key insert find min max walktests knot_test tree_testiter!!#T#default!&T&new!)T)Item)nexttree-----2T2default-5T5new5len5is_empty5insert5contains5first5last5iter5append-@T@Item@IntoIter@ into_iter-ETE from_iterGINodeITIkeyIrightIleftNTPTPeqPneTTT partial_cmpTltWXTleZ[Tgt]^Tge`acTcclonefTffmtTreeKnotiTiEmptykiNonEmptymm0pTrTreqrnevTv partial_cmpvltvlevgtvge}T}cloneTfmt!TreeIterTiter!T!Teqne!Tclone!Tfmt- BinaryTreeTtopsize-Tclone-Tfmt-T-Teqne  ""..//0011Sqrad?pe:Ѡ(a{9jFBlI@ Y3sWĚ3vꥍ\3ގ)IcpavK2/7ٛ˔ǥjX^yae|=UԋBc(XxJ${!-dNY絺cXS` ,nw I&~l,:;đo^㱣XaZ\̓I+|+P\pHE7!@~ 1%=h6$s26eqYOLa',A3.ɥ7H!g*28o P[TQ5ϋ3-w^mfkHݖlH͙EkƤ+5_vq]eR(cxZ/x6,NT\Cwp&91)1m&XhathX+7O&uF@a;z]jqףٚZI/v"6F@!FP]I\y&H*CHFJW牺ه-|#dŢs^<µuS^&yliO=צΓW5o*j0= s"mJ[*@ u9\H,洚7 k^% "Q5epX~}N& fʿmx[f4n0pzRõk0V1f$A]Y︙ Lëyw4AM<Ԡv'RHd "478uAF2Jk"_9=OI~Qct̟Weh!K"׊>/;Ep0'9Z`y K 5Ғn Uø/6:c>לּc[s阘ٍ(@S'>3"vzJJR\kÁ gUqp4uo'K@=tGBY/3QO(}JXH dH"1=\)mWHZ*ʭi aɊ$ i>$aSa;߾!:JAg eHFMdQyuh.ʧ\dz#"qi;|GK*Gmk" x`Ot&١M[Tj!.Lw+zV76וK\כ²- &uSk>6G6i{rORKAC͹xܴۧF=%ŒNUU1h ≹,7=~XYTH+lد%B2>]/")~A+L)7ze}' & Oљnrv((H:& wREV_9ov7mފA鈧(ԛcp\Nl(g{$`}] lحܳKWL~*ۄӕ ҍe~rV͇ h\r#mXǁ>|7$lPHv0[Iw4ƥ'H8 yB>P'cnP-)Rx>DKa%B/YvQ ՘C4URl8unk?)"rVQJjpxLHdo# H, / 倧v6Y:(6^6«kV֥X8_(@=O&-cgډ/ ,1&\# mdxI]Z>,>4ːBV\KoHTon#R^s)7C*o&Qaujģ'R@rPE}cNp)vTf #2%  % % /!-TreeKnoti :/// Библиотека со всеми модулями.:V/// Пользователь использует только самое дерево;VS/// и итератор, так что я решил не давать доступS)/// к другим структурам.)IfcTNPNodeIOrderingVecDequeD i}vpr X/// Трейт Default для узла. По-умолчанию наш узел пустX iTT       4J/// Дефолт-функция возвращает пустой узелJinline7     5/// Все методы для нашего узла.5H/// Для ознакомления советую изучть tests.rsHallow> dead_code T       ?&/// Создаём новый узел&inlineP     selfV/// Метод конвертации узла в неизменяемую ветвь.Vb/// Т.к. узел может быть пуст, то может вызваться паника.binlineY    QI   selfR/// Метод конвертации узла в изменяемую ветвь.Rb/// Т.к. узел может быть пуст, то может вызваться паника.binlinev       self EQ/// Получение ключа из ветви. Возможна паника.Q inline        selfval"A/// Метод добавления значения в узел.!AJ/// Добавление осуществляется рекурсивно!J4/// С помощью обхода в глубину"4"    " selfval)d/// Метод поиска значения в поддереве (не во всём дереве)'dp/// В случае, когда мы не находим значение, или поддерево пусто,'pq/// Вернётся пустой узел, иначе узел с эквивалентным значением.(q)   ) self.?/// Поиск минимального узла в ветви.-?]/// В случае, если поддерево, возвращаем пустой узел..].   . self1?/// Поиск минимального узла в ветви.0?]/// В случае, если поддерево, возвращаем пустой узел.0]1   1 self44/// Обход поддерева в глубину.34R/// Возвращаем дек со значениями из поддерева.3R4   4  7 TreeKnot7i7Node8I7*7/// Тесты для узла77allow777 unused_imports77R BinaryTreeR RTreeKnotSiRNodeSISTreeIterSSVecDequeSStR#/// Тесты для дерева.R#RallowRRR unused_importsRR VecDequeon! "#&) {!{Z/// Добавляем трейт Default для реализации дефолтногоyZ^/// итератора. По-умолчанию наш итератор - пустой дек.z^%T$${{ { {  { !}F0/// Создаём пустой итератор{0///| /// # Example| ///|/// ```| /// use bintree::iter::TreeIter;| ///|./// let def_iter = TreeIter::::default();|.6/// assert_eq!(def_iter.into_iter(), TreeIter::new());}6/// ```}} % ## !O/// Добавляем метод new() для нашего итератора.~O=/// Если честно, то просто по фану :D~=allow dead_code (T''     /S/// Метод new() делает всё то же, что и метод default().SR/// Если очень надо, то можно использовать его.ـR/// /// # Example ////// ``` /// use bintree::iter::TreeIter;ʁ #/// use std::collections::VecDeque;#///#/// let new_iter = TreeIter::new();#L/// assert_eq!(new_iter.collect::>(), VecDeque::::new());L/// ``` ( && ! a/// Делаем наш итератор итератором, а точнее добавляемƒaV/// реализацию трейта Iterator для нашего итератора.VZ/// Это значит, что наш итератор имеет те же методы,Z(/// что и все итераторы.օ(////// # 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();)///4/// assert_eq!(tree_iter.clone().min().unwrap(), 1);44/// assert_eq!(tree_iter.clone().max().unwrap(), 9);4M/// assert_eq!(tree_iter.clone().collect::>(), vec![1, 3, 5, 7, 9]);وM[/// assert_eq!(tree_iter.clone().filter(|x| x % 3 == 0).collect::>(), vec![3, 9]);[/// ```+,%T**  Ɗ  ӊ !O/// Тип итератора соответствует типу дерева.O_/// О том, какой тип может находится в дереве подробно_/// описано в tree.rs))self!Dh/// Метод next() позволяет передвигаться по нашему итераторуŒhd/// поэлементно. Так как мы когда-нибудь дойдём до конца,dc/// то это нужно как-то обозначить. Для этого используемc>/// перечисление (enumeration или enum) Option.>I/// Если мы дошли до конца, то вернётяс None,I/// Иначе Some(T).O/// Здесь мы опустошаем наш итератор, так чтоOO/// ПОВТОРНОЕ ИСПОЛЬЗОВАНИЕ ОДНОГО И ТОГО ЖЕOL/// ИТЕРАТОРА ЗАПРЕЩЕНО (не рекомендуется).L/// /// # Example ////// ```"/// use bintree::tree::BinaryTree;" /// use std::iter::FromIterator;Ò ///M/// let mut tree_iter = BinaryTree::from_iter((0..5).step_by(2)).into_iter();M///*/// assert_eq!(tree_iter.next(), Some(0));**/// assert_eq!(tree_iter.next(), Some(2));**/// assert_eq!(tree_iter.next(), Some(4));*'/// assert_eq!(tree_iter.next(), None);'/// ``` ,  ))TreeKnotǕi-NodeIՕ-TreeIter- FromIterator %-f ./0125@E -/// Головная структура дерево хранит 2 поля: вершину дерева и размер дерева./// Вершина дерева представлена структурой TreeKnot - узел дерева (см knot.rs)4ŻT33    ǹ -rֹinlineֹԹ  4Ż 22 -7/// Реализация трейта Default для дерева. Трейт Default отвечает за значение по-умолчанию.غG/// По умолчанию дерево абсолютно пусто.Gq/// Высокой цели это не преследовало, так что можно идти дальше.q8/// Реализуем методы для дерева.8789:;<=>?ŻT66   :G/// Метод new() делает всё то же, что и default()GR/// По сути является конструктором для дерева.R /// # Example ///Ϳ/// ```ѿ"/// use bintree::tree::BinaryTree;ٿ"///,/// let new_tree = BinaryTree::::new();,0/// let def_tree = BinaryTree::::default();0///?/// assert_eq!(new_tree.len(), 0); // размер дерева?:/// assert_eq!(def_tree.len(), 0); // см. len() ниже:/// ```inline  7Ż 55self4o/// Метод len возвращает размер дерева как беззнаковое 64 битноеor/// Если вдруг размер оказался отрицательным, то вам немедленноrm/// нужно обратиться к врачу или перестать ломать чужой код :)m/// /// # Example ////// ```"/// use bintree::tree::BinaryTree;"///%/// let mut tree = BinaryTree::new();%::new();.//// let mut not_empty_tree = BinaryTree::new();/////// not_empty_tree.insert(&1);/// not_empty_tree.insert(&2);/// not_empty_tree.insert(&3);///$/// assert_eq!(empty_tree.len(), 0);$,/// assert_eq!(empty_tree.is_empty(), true);,///(/// assert_eq!(not_empty_tree.len(), 3);(1/// assert_eq!(not_empty_tree.is_empty(), false);1/// ```inline  9 55selfvalL/// Метод insert() добавляет значение в дерево.L]/// Значение берётся по неизменяемой ссылке, так что]d/// смело юзайте, хотя я бы не рекомендовал использоватьdj/// типы, которые не хранятся на стеке или неразмерные типы.j>/// Ах, да, их и нельзя импользовать)>/// /// # Example ////// ```"/// use bintree::tree::BinaryTree;"/// %/// let mut tree = BinaryTree::new();%/// tree.insert(&1);/// tree.insert(&2);/// tree.insert(&3);///r/// assert_eq!(tree.contains(&1), true); // проверка на наличие значения в дереве.rb/// assert_eq!(tree.contains(&2), true); // для лучшего понимания см tests.rsb_/// assert_eq!(tree.contains(&3), true); // метод contains() рассмотрен ниже_/// ``` : Ż 55selfval_\/// Метод contains() проверяет наличие значения в дереве\N/// Если оно есть, то возвращает true, иначе falseN/// /// # Example ////// ```"/// use bintree::tree::BinaryTree;"///%/// let mut tree = BinaryTree::new();%/// tree.insert(&1);/// tree.insert(&2);/// tree.insert(&3);///(/// assert_eq!(tree.contains(&1), true);((/// assert_eq!(tree.contains(&2), true);((/// assert_eq!(tree.contains(&3), true);(/// ```inline  ; 55selfBT/// Метод first() возвращает минимальное значение,TX/// которое хранится в дереве. Если дерево пустое,XW/// то пудет вызвана паника, сообщающая о том, чтоWK/// дерево пусто, так что будьте осторожны.K/// /// # Example ////// ```"/// use bintree::tree::BinaryTree;"///%/// let mut tree = BinaryTree::new();%////// tree.insert(&3);!/// assert_eq!(tree.first(), &3);!////// tree.insert(&2);"/// assert_eq!(tree.first(), &2);"////// tree.insert(&1);"/// assert_eq!(tree.first(), &1);"/// ```inline  <ވ 55selfAZ/// Метод last() возвращает наибольший элемент дерва.Z[/// В случае, когда дерево пусто, вызывается паника.[/// /// # Example ////// ```"/// use bintree::tree::BinaryTree;"///%/// let mut tree = BinaryTree::new();%////// tree.insert(&1); /// assert_eq!(tree.last(), &1); ////// tree.insert(&2); /// assert_eq!(tree.last(), &2); ////// tree.insert(&3); /// assert_eq!(tree.last(), &3); /// ```inline  =ވ 55selfnL/// Метод iter() превращает дерево в итератор,LM/// который хранит элементы по-возрастанию.MS/// Метод приватный, вместо этого используетсяS?/// into_iter() из трейта IntoIterator (см. ниже)?\/// Само дерево остаётся, так что смело используйте.\9/// Для лучшего понимания см iter.rs9/// /// # Example ////// ```"/// use bintree::tree::BinaryTree;"///%/// let mut tree = BinaryTree::new();%/// tree.insert(&1);/// tree.insert(&2);/// tree.insert(&3);///F/// assert_eq!(tree.into_iter().collect::>(), vec![1, 2, 3]);F/// ```inline  > 55selfother M/// Метод append() передаёт элементы из 1 дереваMa/// в другое. Используемое дерево остаётся неизменным,aH/// так что его можно также использовать.HT/// Здесь мы создаём итератор из второго дереваT^/// и перемещаем по ссылкам элементы в первое дерево.^/// /// # Example ////// ```"/// use bintree::tree::BinaryTree;"///&/// let mut tree1 = BinaryTree::new();&&/// let mut tree2 = BinaryTree::new();&////// tree1.insert(&1);/// tree2.insert(&2);/// tree2.insert(&3);////// tree1.append(&tree2);///G/// assert_eq!(tree1.into_iter().collect::>(), vec![1, 2, 3]);G/// ``` ? Ż 55 ->();?8/// let test2 = tree.clone().into_iter().min().unwrap();86/// let test3 = tree.clone().into_iter().sum::();6///%/// assert_eq!(test1, vec![1, 2, 3]);%/// assert_eq!(test2, 1);/// assert_eq!(test3, 6);/// ```///BCDŻ%ŻTAA     -@@-@@self-=R/// Метод into_iter() превращает наше дерево в TreeIter.R/// /// # Example€ ///Ѐ/// ```Ԁ"/// use bintree::tree::BinaryTree;܀"///&/// let mut tree1 = BinaryTree::new();&&/// let mut tree2 = BinaryTree::new();&///с/// tree1.insert(&1);Ձ/// tree2.insert(&2);/// tree2.insert(&3);////// tree1.append(&tree2);///G/// assert_eq!(tree1.into_iter().collect::>(), vec![1, 2, 3]);G/// ``` DŻ @@ -I/// Добавление трейта FromIterator для дереваӃId/// Теперь мы можем построить целое дерево из итератора.d/// /// # Example ////// ```"/// use bintree::tree::BinaryTree;" /// use std::iter::FromIterator;Å ///#/// let range = (0..11).step_by(2);#4/// let mut new_tree = BinaryTree::from_iter(range);4///T/// assert_eq!(new_tree.into_iter().collect::>(), vec![0, 2, 4, 6, 8, 10]);ņT/// ```GŻ%ŻTFFڇ     iter- GIŔŻ EIHHEŔ%ŔŔ% /// Ветвь дерева.R/// Хранит ключ (значение), правый и левый узел.R^/// Используются те же трейты, что и для узла (см. knot.rs)^KLMTJJ     II II II  TOO        automatically_derived   allow    unused_qualifications  RS TQQ        selfother   inline   R   PPselfother   inline   S PP    automatically_derived   allow    unused_qualifications  VWZ]` TUU        selfother   inline   V TTselfother   inline   W TTselfother   inline   Z TTselfother   inline   ] TTselfother   inline   ` TT automatically_derivedallow unused_qualificationse Tdd      selfinline e cc automatically_derivedallow unused_qualificationsh/Tgg/     selff h / ff  ya/// Перечисление (enumeration или enum) узел для нашего дерева.aS/// Узел может быть либо пустым, либо не пустым.SV/// Если он пуст, то принимает значение Empty, иначеV7/// NonEmpty, которое хранит Box>.7^/// Т.к. наша структура рекурсивна (Узлы хранят ветви, ^b/// а ветви хранят узлы), но наша структура должна иметь bo/// некий размер, который можно вычислить в момент компиляции, oq/// то я принял решение использовать Box, который добавляет всё qg/// содержимое в кучу, и хранит некий указатель на всё это, gV/// который на стеке имеет константное значение. V///T/// Используются всё те же трейты Debug, Clone и PartialEqTk/// плюс новый для нас трейт PartialOrd, который умеет сравниватьky/// на больше-меньше. Это сделанно для того, что бы мы могли выбиратьyQ/// нужную нам ветвь, когда мы ходим по дереву.Q///a/// Т.к. перечисление приватно, то советую изучить tests.rsaM/// В котором для каждого метода есть тесты.Mkm Tjj       iiliiliino m iin n iiNonEmpty  Tqq        automatically_derived   allow    unused_qualifications  tu Tss        selfother   inline   t  rrselfother   inline   u޻ rr    automatically_derived   allow    unused_qualifications  xyz{| Tww        selfother   inline   x޻ vvselfother   inline   y޻ vvselfother   inline   z޻ vvselfother   inline   {޻ vvselfother   inline   |޻ vv automatically_derivedallow unused_qualifications T~~      selfinline  }} automatically_derivedallow unused_qualifications/T/     selff   yyxgM/// Реализация итератора для нашего дерева.oMl/// Для полного понимания советую ознакомится с реализациейolS/// самого дерева, если вы этого ещё не сделали.pS///qU/// Для итератора я принял решение использоватьqUQ/// std::collections::VecDeque, т.к. он шустрее двусвязногоrQ]/// списка (std::collections::LinkedList), а также он может удалятьr]E/// элементы как с конца, так и с начала.sEk/// В деке мы храним сами элементы, однако менять содержимоеskf/// итератора нельзя, т.к. может нарушиться логика дерева.tf///uf/// Для нашего итератора мы используем те же трейты, что иuf)/// для дерева, а именно:v)G/// Debug (для вывода на консоль или в файл),vGP/// Clone (для полного клонирования экземпляра),wPY/// PartialEq (для сравнения на равенство-неравенство).wY&Tyy y y  y yy y!x Tyy y y  y x !x x automatically_derivedx x x allowx x x  unused_qualificationsx x  Tx  x y y y  y selfother !x x inlinex x x    xselfother !x x inlinex x x  x x!xxautomatically_derivedxxxallowxxx unused_qualificationsxx Tx xy y y  y self!xxinlinexxx  x x!xxautomatically_derivedxxxallowxxx unused_qualificationsxx/Tx/xy y y  y selff!xx  x  [/// Реализация бинарного дерева поиска на языке Rust.[/// О СТРУКТУРЕ:w/// Бинарное дерево поиска (Binary Search Tree) - условно направленный граф,w/// каждый узел котрого имеет ключ - некое значение, которое можно сравнивать6/// и две ветви - правую и левую.6p/// (будем считать, что ветви есть всегда, просто они могут бытьҙpK/// либо пустыми, либо содержать значение).ÚK/// В левой ветви хранятся узлы, ключи (значения) которых меньше ключа текущего/// узла. В классической реализации бинарное дерево не хранит одинаковые ключи./// В моей реализации это возможно, узлы, ключи которых больше или равны текущему./// хранятся в левой ветви..////// В текущей реализации удалять ключи ПОКА ЧТО нельзя из-за сложностей реализации,/// но это временно. Реализована система добавления и поиска ключа, а также рядJ/// других полезных фич, упрощающих жизнь.J////// Дерево можно сравнивать с себе подобными деревьями по принципу "равно-неравно"./// От трейта PartialOrd решил отказаться во избежание недопонимания пользователя./// Если вы хотите сравнить размер, то это возможно сделать с помощью методов/// len() и is_empty(). Если вы хотите сравнивать ещё что-то, то можете написать своюS/// функцию или реализовать полноценный трейт.S///y/// Также дерево можно вывести на экран с помощью форматного выводаyl/// (т.е. print!("{:?}" ...). Трейт Debug также упрощает работу с тестами,l/// т.е. вы можете использовать дерево для тестирования моих или ваших функций.ݨ////// Так же к дереву подключён трейт Clone, позволяющий полностью копировать^/// экземпляр дерева, если в этом есть необходимость.^///ҫ/// Дерево может импользовать все те типы, которые поддерживают трейты֫}/// Copy, Clone, PartialOrd, PartialEq. Иными словами их можно переносить, копировать,֬}/// сравнивать между собой по типу больше-меньше и равно-неравно. Если типы, которыеԭ/// вы хотите использовать, не поддерживают этих трейтов (а именно: сложные структуры, которые хранят/// свои значения в куче (Vec, LinkedList, HashMap и т.д.), срезы, статические массивы, NAN и т.д.),w/// то вы не сможете импользовать дерево по техническим причинам :(w////// Если вы хотите полностью ознакомится с кодом, то переходите по ссылке ниже:?/// https://github.com/dinaraparanid/Structures/tree/master/src?V/// Это репозиторий на GitHub с полной версией кода.Vi/// Если есть предложения, то не стесняйтесь, предлагайте :)ִiŻ5T      ׶ ܵ-ܵܵautomatically_derivedܵܵܵallowܵܵܵ unused_qualificationsܵܵŻ ŻTܵ ܵ     self-ܵܵinlineܵܵܵ Ż ܵ յ-յյautomatically_derivedյյյallowյյյ unused_qualificationsյյŻ/ŻTյ/յ     selff-յյ  յ -ʵ ŻŻT     ʵ -ʵ ʵ automatically_derivedʵ ʵ ʵ allowʵ ʵ ʵ  unused_qualificationsʵ ʵ Ż ŻŻTʵ  ʵ      selfother -ʵ ʵ inlineʵ ʵ ʵ  ʵselfother -ʵ ʵ inlineʵ ʵ ʵ  ʵ YWYYYY        (Y   __self_0_2 __self_1_2XъWXXXX ь                   X  __self_0_1 __self_1_1 __self_0_2 __self_1_2\ъZ\\\\ ь  \  __self_0_2 __self_1_2[ъZ[[[[ ь                ޘ   [ޓ ޘ __self_0_1 __self_1_1 __self_0_2 __self_1_2_ъ]____ ь  _  __self_0_2 __self_1_2^ъ]^^^^ ь                   ^ޓ  __self_0_1 __self_1_1 __self_0_2 __self_1_2bъ`bbbb ь  b  __self_0_2 __self_1_2aъ`aaaa ь                   aޓ  __self_0_1 __self_1_1 __self_0_2 __self_1_2{$|}}}~H=0S &[4)~Ѝō%sÝ /P̭z޳= Pn+bWl*7, c W  YNV |!+NbL>~[PYNmYMg{&|}}}~J>2U (]6*ҍƍ'u ŝ 1Rέ|? Rp1dXn, 9- d Y  [OX }#-Pd R?]Q[On[Ni{)|}}}~M?5X+Ć`9+ՍǍ*x#ȝ 2Sϭ}@ Us4gYq/!<. e \  ^P[&0S g S@ `R^Rq ^Ol|Z}}CԀ΃sY)Vf/ˍ `SpE`ؽZx#]%Zz'T_Nq)D%V|WvT){-|}}~R :\0Ɇd> ڍ 0})͝"7YԭF Zx9ku3@2 i ` b_*4WkW db(Wvc q{S}} 0~ d  Dɟ )|V+{q$ca1~!؀҃w]-eXEҟuJeݽ_}*^2" i ~}+cR[u-,}s)&\{#ce.)!ڃe5`}'RmfF* } $3kZ}52,7:~N-^/)fhv07oE wͥ/]w }5=&k,@+w=9BB~18pF hxV՟Υ0^³xb9!~O6  ->'lj-A7,x>1_}!:ntCU~90!D|R)piۥ=kϳ(jL4BJ,/x}9MJ9.$KFh6HQ]  7|_3b + 1 bintreex86_64-pc-windows-gnu-2845334d702c4ed2!g# / -~~؏ "߼