[Powered by Google Translate] [Члан 7] [мање комфорни] [Нејт Хардисон] [Универзитет Харвард] [Ово је ЦС50.] [ЦС50.ТВ] Добродошли у члану 7. Захваљујући урагана Сенди, уместо нормалан део ове недеље, ово радимо шетња кроз кроз град питања. Ја ћу пратити уз проблема Сет 6 спецификацију, и пролази кроз сва питања у Члан секције питања. Ако постоје било каква питања, пошаљите ово на ЦС50 расправљати. Добро. Хајде да почнемо. Сада гледам страни 3 спецификацији проблема Сет. Ми ћемо прво да почнем да причам о бинарних стабала јер они имају доста проблема значаја за скуп овонедељном - Хуффман кодирање Трее. Један од првих структура података разговарали смо о томе на ЦС50 је низ. Запамтите да је низ низ елемената - сви истог типа - складиште одмах поред другог у меморији. Ако имам целобројну низ који може да извуче користи ову кутије-бројеви-целих стил - Рецимо имам 5 у првом пољу, имам 7 у другом, онда имам 8, 10, и 20 у коначном пољу. Запамтите, две заиста добре ствари о овом низу су да имамо тај константни времену приступ било ког елемента  у низу, ако знамо свој индекс. На пример, ако желим да зграбите трећи елемент у низу - у индексу 2 користећи наш нула-базиран систем означавања - Само сам буквално морати да урадите једноставан математички прорачун, хоп на ту позицију у низу, извуците 8 који се тамо чувају, и ја сам у реду. Једна од лоших ствари о овом низу - да смо разговарали о томе када смо разговарали повезане листе - је да ако желите да убаците елемент у овом низу, Ја ћу морати да урадим неке померања около. На пример, овај низ овде у сортираном редоследу - сортиране у растућем редоследу - 5, а затим 7, па 8, па 10, па 20 - али ако желите да убаците број 9 у овом низу, Ја ћу морати да се помери неки од елемената како би простор. Можемо извући ово овде. Ја ћу морати да преместите 5, 7, а затим 8; створи јаз где могу пребацити 9, а затим 10 и 20 може да иде десно од 9 година. То је нека врста бола, јер у најгорем случају - када имамо да убаците или на почетку или на крају низа, у зависности од тога како ћемо померања - можда ћемо на крају морати да смени све елементе да тренутно складиштење у низу. Дакле, шта је било обрнуто ово? Начин око овога био је да се иде на нашу линкед-лист метод где - уместо чувања елементе 5, 7, 8, 10, и 20 све поред другог у меморији - шта смо урадили уместо да им се складишти некако где год смо хтели да их сместите у овим линкед-лист чворова које сам извлачење овде, какву ад хоц. А онда смо их заједно повезани помоћу ових следеће савете. Ја могу имати показивач од 5 до 7, Показивач од 7 до 8, Показивач од 8 до 10, и коначно, показивач од 10 до 20, а онда нула показивач на 20 указује на то да нема ништа лево. Трговински-офф да смо ми овде имамо је да сада, ако желимо да убаците број 9 у нашу сортиране листе, све што треба да урадите је да направите нови чвор са 9, жице га да укаже на одговарајуће место, и онда поново жица је 8 да укаже до 9 година. То је прилично брзо, под претпоставком да тачно знамо где желимо да убаците 9. Али трговина-офф у замену за то је да смо сада изгубили константна времена приступ било посебно елемент у нашој структури података. На пример, ако желите да пронађете четврти елемент у овој повезаној листи, Ја ћу морати да почне на самом почетку листе и раде свој пут кроз рачунајући чвор-по-чвор док не нађемо четврту један. Да би добили боље перформансе него приступ повезаном листи - али и задржати неке од предности које смо имали у смислу убацивања времену из повезаног листи - бинарна стабла ће морати да користе мало више меморије. Конкретно, уместо да само има један показивач у бинарном стаблу чвора - као линкед листи чвор чини - ћемо додати други показивач на бинарни чвору дрвета. Уместо само да један показивач на следећи елемент, ћемо имати показивач на леву детета и право детета. Хајде да нацртају слику да видимо шта је то заправо изгледа. Опет, ја ћу да користе ове кутије и стрелице. Бинарно стабло чвор ће кренути са само једноставним кутији. То ће имати простора за вредности, а онда, такође ће имати простор за леву детета и право детета. Ја ћу да их етикетирају овде. Ми ћемо имати леви дете, а онда ћемо имати право дете. Постоји много различитих начина да се ово уради. Понекад се за простор и удобност, Ја стварно ћу га извући као да радим овде на дну где ћу имати вредност на врху, и онда право дете на доњем десном, и лево дете на доњем левом. Враћајући се овај врхунски дијаграма, имамо вредност на самом врху, онда имамо леви показивач дете, а онда ћемо имати право детета и показивач. У спецификацији проблема сету, говоримо о изради чвор који има вредност 7, и онда лево-дете показивач који је ништаван и десно дете показивач који је нулл. Ми или може писати НУЛЛ капитала у простор за и лево дете и десно дете, или можемо да извучемо ову коса црта кроз сваки од кутија указују на то да је ништаван. Ја ћу то да урадим само зато што је једноставније. Оно што видите овде су два начина дијаграмима веома једноставан бинарни стабла чвор где имамо вредност 7 и нулл дете показивача. Други део наших разговора о томе како спецификацији са повезаним листама - Запамтите, ми смо имали само да држите на први елемент у листи да запамтите целу листу - а исто тако, са бинарном стаблу, ми само треба да држите на једном показивач на дрвету како да одрже контролу над читавом структуром података. Ова специјална елемент дрвета се назива корен чвор стабла. На пример, ако је ово један чвор - чвор који садржи ова вредност 7 са нулл леве и десне дете тројке - били једина вредност у нашем дрвету, онда ће то бити наш корен чвор. То је само почетак нашег дрвета. Можемо видети мало јасније када почнемо додавање више чворова на наше дрво. Дозволите ми да подигне нову страницу. Сада ћемо да нацртају дрво које има 7 у корену, и 3 унутар левог детета, и 9 унутрашњости десног детета. Опет, ово је прилично једноставан. Имамо 7, нацртајте чвор за 3, чвор за 9, и ја ћу поставити лево дете показивач од 7 да укаже на чвору садржи 3, и десни показивач дете чвора садржи 7 до чвора садржи 9. Сада, пошто 3 и 9 немају деце, ћемо поставити све своје деце показивача буде нула. Ево, корен нашим фондовима дрвећа одговара чвору садржи број 7. Можете видети да ли сви имамо јесте показивач на том корена чвора, онда може да хода кроз наше дрво и приступ оба чвора дете - и 3 и 9. Нема потребе да се одржи показиваче на сваки чвор на дрвету. Добро. Сада ћемо додати још један чвор овом дијаграму. Ми ћемо додати чвор садржи 6, а ми ћемо додати ово као прави дете чвора садржи 3. Да бисте то урадили, ја ћу да избришу тај нулл показивач у 3-чвор и жица га да укаже на чвору садржи 6. Добро. У овом тренутку, идемо у мало терминологије. За почетак, разлог да се то зове бинарно стабло нарочито је да има два детета показиваче. Постоје и друге врсте дрвећа које имају више деце показиваче. Конкретно, ти си 'покушати' у Проблем Сет 5. Приметићете да се у тој покушаја, имали сте 27 различитих показивача на различите деце - једна за сваку од 26 слова у енглеском алфабету, а затим и 27. за апострофом - па, то је слично врсти дрвета. Али овде, пошто је двојности, имамо само два детета показиваче. Поред овог корена чвора о коме смо говорили, смо такође били бацање около термин 'дете'. Шта то значи за једног чвора буде дете другог чвора? То буквално значи да дете чвор је дете другог чвора ако то чвор има једну од својих дечјих показивача постављеним да укаже на тај чвор. Да би ово у још конкретније, ако 3 је указао на један од детета показивача од 7, а затим 3 је дете од 7. Ако смо да схватимо шта су деца 7 су - па, видимо да 7 има показивач на 3 и показивач до 9, па 9 и 3 су деца 7. Девет нема децу, јер њени дете показивачи је ништаван, и 3 има само једно дете, 6. Шест такође нема деце јер су од његових показивача је ништаван, што ћемо извући сада. Поред тога, ми такође разговарати о родитељима одређеног чвора, и то је, као што сте очекивали, обрнута ове деце описа. Сваки чвор има само једног родитеља - уместо два као што би сте очекивали са људима. На пример, родитељ 3 је 7. Родитељ 9 је такође 7, а родитељ је 6 3. Не много тога. Такође имамо услове да причају о деде и унука, и генерално говоримо о прецима и потомци одређеног чвора. Предак чвор - или преци, тачније, од чвора - су све чворова који леже на путу од корена до тог чвора. На пример, ако ја гледам на чвора 6, онда преци ће бити и 3 и 7. Преци 9, на пример, су - ако сам гледајући чвора 9 - онда предак 9 је само 7. А потомци су управо супротно. Ако желим да погледам све потомака 7, онда морам да погледам све чворове испод њега. Дакле, имам 3, 9 и 6 све као потомцима 7. Крајњи рок да ћемо разговарати о томе је ова идеја буде брат. Брат и сестра - врста након заједно на овим породичним условима - су чворови који су на истом нивоу у дрвету. Дакле, 3 и 9 су браћа и сестре, јер су на истом нивоу у дрвету. Обојица имају исту родитеља, 7. Тхе 6 нема браћу и сестре, јер 9 нема деце. И 7 нема никакве браћу и сестре, јер је корен нашег дрвета, и ту је само још 1 корен. За 7 имају браћу и сестре неће бити чвор изнад 7 година. Ту би требало да буде родитељ 7, у ком случају 7 више неће бити корен стабла. Онда је нови родитељ 7 би такође требало да имају дете, и то дете би онда био брат 7. Добро. Идемо даље. Када смо почели нашу дискусију бинарних стабала, Разговарали смо о томе како ћемо их користити за стекне предност над оба низова и повезаним листама. А начин на који ћемо да урадимо то је са овом наручивање имовине. Ми кажемо да бинарно стабло је наређено, према спецификацији, ако за сваки чвор у нашој дрвету, све своје потомке на лево - лево дете и сви потомци левој детета - имају мање вредности, као и свим чворовима на десно - право дете и сви потомци десној детета - имају чворове веће од вредности текућег чвора који смо гледали. Само за једноставност, ми ћемо претпоставити да не постоје дупликати чворови у нашем дрвету. На пример, у овом дрвету нећемо се бавити у случају где имамо вредност 7. у корену  и онда имамо вредност 7. другде у дрвету. У том случају, ви ћете приметити да ово дрво је заиста наредио. Имамо вредност 7 у корену. Све лево од 7 - ако сам ундо све ове мале марака овде - све са леве стране 7 - 3 и 6 - те вредности су и мање од 7, а све на десно - што је управо то 9 - је већа од 7 година. Ово није једини наредио стабла која садржи ове вредности, али хајде да нацртате још неколико њих. Заправо постоји гомила начина на који можемо да урадимо ово. Ја ћу користити стенографију само да би се ствари једноставно где - него извлачење цела кутије-и-Стрелице - Ја ћу само да извуку бројеве и додајте стрелице које повезују их. За почетак, само ћемо написати нашу првобитну стабло где смо имали 7, а затим 3, а онда 3 указао назад на право на 6, и 7 имали право дете које је 9. Добро. Шта је још један начин на који можемо писати ово дрво? Уместо да буде 3 лева дете од 7, Такође смо могли имати 6 буде лево дете од 7, а онда 3 се лево дете 6. То би изгледало овако дрво овде где сам добио 7, па 6, а затим 3 и 9 на десно. Ми такође не морају да имају 7 као наш корен чвор. Такође смо могли имати 6 као наш корен чвор. Шта би то изгледало? Ако ћемо да одржимо ту наредио имовину, све до леве стране 6 мора да буде мања од њега. Постоји само једна могућност, а то је 3. Али онда као прави дете од 6 година, имамо две могућности. Прво, можемо имати 7 и онда 9, или бисмо могли да скрене - као да ћу да урадим овде - где имамо 9 као прави дете у 6, а затим и 7 као левог детета од 9 година. Сада, 7 и 6 нису само могуће вредности за корен. Такође смо могли имати 3 бити у корену. Шта се дешава ако 3 је у корену? Овде ствари постају мало занимљиво. Три нема никакве вредности које су мање од ње, тако да цела лева страна дрвета је само ће бити ништаван. Нема ће бити нешто тамо. Са десне стране, могли бисмо навести ствари у растућем редоследу. Могли смо 3, затим 6, 7, затим затим 9. Или, можемо до 3, затим 6, онда 9, а затим 7. Или, можемо до 3, па 7, па 6, а затим 9. Или, 3, 7 - заправо, не, не можемо направити 7 више. То је било наше једна ствар. Можемо до 9, а затим од 9 можемо до 6, а затим 7. Или, можемо до 3, па 9, па 7, а затим 6. Једна ствар да вам скренем пажњу на овде да су ови дрвеће мало чудно изгледа. Конкретно, ако се осврнемо на 4 стабала на десној страни - Ја ћу их заокружи, овде - ово дрвеће изгледају скоро исто као повезану листу. Сваки чвор има само једно дете, па немамо неки од овог дрвећа као структуре које видимо, на пример,  у овом једном Лоне Трее овде на доњој левој страни. Ово дрвеће заправо зове дегенерише дрвеће бинарне, и ми ћемо разговарати о овоме више у будућности - нарочито ако идете на предузимање других курсеве информатике. Ове дрвеће дегенерише. Они нису од велике користи, јер, заиста, ова структура је погодна  да проналажење пута сличне оној повезану листу. Ми не добијамо да искористе додатне меморије - овај екстра показивач - због наше структуре буду лоше на овај начин. Уместо иду даље и извући бинарне дрвећа које имају 9 у корену, што је коначна случај да бисмо имали, уместо тога смо, у овом тренутку, причати мало о том другом року да ми користимо када говоримо о дрвећу, који се зове висина. Висина стабла је растојање од корена до највише далекој чвора, односно број скокова које би морате направити у циљу почети од корена, а затим завршити на највише далекој чвора у стаблу. Ако се осврнемо на неке од ових стабала која смо нацртана овде, можемо да видимо да ако узмемо ово дрво у горњем левом углу и почнемо на 3, онда морамо да 1-хоп да се на 6, други хоп да дођете до 7, и трећи скок доћи до 9 година. Дакле, висина овог стабла је 3. Можемо да урадимо исту вежбу за другим наведеним дрвећа са овим зеленим, и видимо да је висина свих ових стабала је заиста 3. То је део онога што их чини дегенерик - да је њихова висина је само једна мање од броја чворова у целој дрвета. Ако погледамо ову другу дрвету које је окружено црвеном, с друге стране, видимо да је највише удаљене лиснате чворови су 6 и 9 - оставља што они чворови који немају децу. Дакле, како би се из корена чвора на било на 6 или 9, морамо да направимо један скок да дође до 7, а затим други скок да дођете до 9, а исто тако, само други скок од 7 до стигнемо до 6 година. Дакле, висина овог стабла овде је само 2. Можете да се вратите и то за све остале дрвећа које смо раније разговарали почињу са 7 и 6, и видећете да је висина свих ових стабала је 2. Разлог што смо говорили о наређено бинарних стабала и зашто су кул је, јер можете претраживати преко њих веома сличан начин за претраживање преко сортираних низа. Ово је место где ћемо разговарати о добијању тог побољшани проналажење времена преко једноставног повезане листе. Са повезаном листом - ако желите да пронађете одређену елемент - ти си у најбољем урадити неку врсту линеарног претраге где почети на почетку листе и хопа један по један - један по један чвор чвор - кроз целу листу док не пронађете шта год да тражите. Док, ако имате бинарни дрво које се налазе у овом лепом формату, ви у ствари можете добити више од бинарног претраживања дешава где сте завади па владај и претраживање преко одговарајућег половини стабла на сваком кораку. Хајде да видимо како то функционише. Ако имамо - опет, да се вратимо на наш првобитни дрвета - почнемо у 7, имамо 3 на левој страни, 9 на десној страни, и испод 3 имамо 6. Ако желимо да тражите број 6 у овом дрвету, ми би почети у корену. Ми бисмо упоредили вредност тражимо, рецимо 6, на вредност ускладиштена у чвор који тренутно гледамо, 7, Сматрају да 6 заиста мање од 7, па бисмо прешли на леву страну. Ако је вредност од 6 био већи од 7, што би уместо тога преселио у десно. Пошто знамо да је - због структуре наше наредио бинарног дрвета - све вредности мање од 7 ће бити смештене на левој 7, нема потребе ни да сметају гледа кроз десну страну стабла. Када смо прешли на леву страну и сада смо на чвору садржи 3, можемо да урадимо исту поређење где смо упоредили 3 и 6. И ми смо сазнали да док је 6 - вредност тражимо - већи од 3, можемо ићи на десној страни чвора садржи 3. Нема лева страна овде, па смо могли да игноришу то. Али ми само знамо да је због гледамо на самом стаблу, и можемо видети да је дрво нема деце. Такође је прилично лако да потражите 6 у овом дрвету ако смо то радили сами, као људи, али хајде да прате овај процес механички као компјутер ће учинити да заиста разумеју алгоритам. У овом тренутку, ми смо сада гледа на чвор који садржи 6, а ми тражимо вредност 6, тако је, заиста, ми смо пронашли одговарајући чвор. Нашли смо вредност 6 у нашем дрвету, и можемо зауставити нашу претрагу. У овом тренутку, у зависности од тога шта се дешава, можемо рећи, да смо пронашли вредност 6, она постоји у нашем дрвету. Или, ако планирате да убаците чвор или уради нешто, што можемо да урадимо је да у овом тренутку. Хајде да урадимо још пар лоокупс само да видим како ово функционише. Хајде да погледамо шта се дешава ако смо да покушамо и погледајте вредност 10. Ако бисмо потражили вредност 10, што ће почети у корену. Ми бисмо видети да 10 је већи од 7, па бисмо прешли на десну страну. Ми бисмо доћи до 9 и упоредите 9 до 10 и видим да 9 је заиста мање од 10. Дакле, опет, ми бисмо покушати да се преселе у десно. Али, у овом тренутку, ми бисмо приметили да смо у нулл чвор. Тамо нема ничега. Нема ништа, где би требало да буде 10. Ово је место где можемо да пријаве кварове - да заиста постоји 10 у дрвету. И на крају, идемо кроз случај где ми покушавамо да потражи 1 у дрвету. То је слично ономе што се дешава ако гледамо горе 10, осим уместо да иду на десно, ћемо ићи на лево. Почињемо на 7 и види да је 1 мањи од 7, па смо прешли на леву страну. Ми смо добили на 3 и видим да је 1 мање од 3, па опет покушавамо да пређемо на лево. У овом тренутку имамо нулл чвор, тако да смо опет могу пријавити квар. Ако не желите да сазнате више о бинарних стабала, постоји гомила забаве малих проблема које можете да урадите са њима. Предлажем вежбање цртеж од ових дијаграма један по један и после кроз све различите кораке, јер ће доћи у супер руци не само када сте раде Хуффман кодирање проблема сет али иу будућим курсева - само учење како да се извуче ове структуре података и мислим да кроз проблеме са оловка и папир, или у овом случају, иПад и оловка. У овом тренутку ипак, ми ћемо да пређемо на нешто уради кодирање праксе и заправо играју са овим бинарним стаблима и види. Идем да се вратите у мом рачунару. За овај део секције, уместо коришћењем ЦС50 Рун или ЦС50 простори, Идем да користе апарат. Након заједно са спецификацијом проблема сету, Видим да сам требао да отворим апарат, идите на мој Дропбок фолдер, креирајте фолдер под називом Члан 7, и онда креирајте фајл који се зове бинари_трее.ц. Идемо. Имам апарат већ отворен. Идем попните терминал. Ја идем у дропбок фолдер, направите директоријум под називом сецтион7, а видим да је потпуно празна. Сада ћу да отворим бинари_трее.ц. Добро. Идемо - празан фајл. Идемо назад у спецификацији. Спецификација тражи да створи нову дефиницију типа за бинарни стабла чвора садржи инт вредности - баш као и вредности које смо цртали у наш дијаграмима пре. Ми ћемо користити овај општенаменским типедеф да смо урадили овде да треба препознати Проблем Сет 5 - ако си тараба табеле начин освајања Спеллер програма. Такође би требало да га препозна из одељка прошлонедељном где смо разговарали о повезаним листама. Имамо ово типедеф струцт од чвора, и ми смо дали ову струцт ноде ово име струцт ноде унапред па да онда може да се односи на њега, јер ћемо желети да имају показиваче струцт чворова као део нашег струцт, али онда смо окружени ово - односно прилогу ово - у типедеф тако да је, касније у коду, можемо упутити на овај струцт само као чвор уместо струцт чвора. Ово ће бити врло сличан појединачно-линкед листе дефиницији коју смо видели прошле недеље. Да бисте то урадили, хајде да почнемо тако писање ван општенаменским. Знамо да морамо да имамо целобројну вредност, па ћемо ставити у инт вредности, а затим уместо да само један показивач на следећи елемент - као што смо урадили са појединачно повезане са листама - ћемо имати лево и десно показиваче деце. То је прилично једноставно превише - струцт ноде * лево дете; и струцт ноде * право дете;. Кул. То изгледа као прилично добар почетак. Идемо назад у спецификацији. Сада морамо да прогласи глобалну променљиву * чвор за корен стабла. Идемо да ова глобална баш као што смо направили први показивач у нашем повезаној листи и глобалног. То је било толико да је у функцијама које пишу не морамо да пролази око овог корена - иако ћемо видети да ли ти желиш да рекурзивно пишем ове функције, можда би било боље да нису ни прође око себе као глобални на првом месту и уместо да покрене локално у главној функцији. Али, ми ћемо то урадити на глобалном нивоу за почетак. Опет, ми ћемо дати неколико места, а ја ћу да прогласи чвор корен *. Само да се уверите да не одем ово неиницијализоване, ја ћу да га једнако нулл. Сада, у главном функцији - која ћемо писати веома брзо овде - маин (инт аргц, цхар * аргв []) - и ја ћу почети декларисање моју аргв низ као цонст само да знам да су ти аргументи су аргументи који вероватно не желе да мењају. Ако желим да их мењате, вероватно би требало да буде доношење копије. Видећете ово много у коду. То је у реду било који начин. То је у реду да га остави као - изоставите цонст ако желите. Ја обично стави у само тако да сам себе подсетим  да ја вероватно не желите да мењате те аргументе. Као и увек, ја ћу овај повратну 0 линију на крају главни. Ево, ја ћу покрене свој чвор корена. Како стоји сада, имам показивач који је постављен на нулл, тако да се показује на шта. Да би заиста почети изградњу чвор, Прво треба да издвоји меморију за то. Ја ћу то да урадим тако што меморију на гомили користећи маллоц. Ја ћу поставити корен једнак резултат маллоц, и ја ћу користити сизеоф оператора за израчунавање величине чвора. Разлог да ја користим сизеоф чвор насупрот, рецимо, нешто овако - маллоц (4 +4 +4) или маллоц 12 - је зато што желим да мој код буде компатибилна могуће. Желим да будем у стању да преузме ову датотеку ц., То састави на апарату, а затим га компајлирате на мом 64-битном Мац - или на потпуно другачији архитектуре - и желим све ово да радимо исто. Ако сам претпоставке о величини променљиве - величина једног инт или величине показивачем - онда сам правим претпоставке о врстама архитектуре на којој је мој код може успешно састави када трчи. Увек користите сизеоф насупрот ручно сумирањем струцт поља. Други разлог је да постоји можда постава да компајлер ставља у струцт. Чак и само сумирањем појединачних поља није нешто што обично желите да урадите, тако, избрисати ту линију. Сада, да стварно покрене овај чвор корена, Ја ћу морати да прикључите вредности за сваки од њених различитих области. На пример, за вредност знам да желим да се покрене на 7, и за сада ћу поставити лево дете буде нула и право дете такође бити нула. Сјајно! Урадили смо тај део спецификације. Спецификација доле на дну стране 3 ме пита да створи још три чвора - једна садржи 3, један садржи 6, и један са 9 - и онда их пошаљем горе тако да изгледа баш као и наша стабла дијаграму да смо причали раније. Хајде да то урадимо врло брзо овде. Видећете веома брзо да ћу да почнем да пишем гомилу дупликата кода. Идем да створи чвора * и ја ћу да га зову три. Ја ћу да га подесите једнак маллоц (сизеоф (чвор)). Ја ћу поставити три-> вредност = 3. Три -> лефт_цхилд = НУЛЛ; три -> десно _цхилд = НУЛЛ; као добро. То изгледа прилично сличан иницијализација корен, и то је управо оно што Ја ћу морати да урадим ако почнем иницијализација 6 и 9, као добро. Ја ћу то урадити веома брзо овде - заправо, ја ћу да урадим мало копирања и лепљења, и уверите се да сам - у реду.  Сада, ја сам добио то копирали и ја могу ићи напред и поставити је једнак 6. Можете видети да је за то потребно неко време и није супер ефикасан. У само мало, ми ћемо написати функцију која ће то учинити за нас. Желим да замени то са 9, замените то са 6 година. Сада имамо све наше чворова креира и иницијализује. Имамо наш корен једнако 7, или садрже вредност 7, наш чвор садржи 3, наш чвор садржи 6, а наш чвор садржи 9. У овом тренутку, све што треба да урадите је да жице све горе. Разлог сам иницијализован све упућује на нулл је тако да сам сигуран да тај Ја немам никакве неиницијализоване савете у било случајно. И такође, јер, у овом тренутку, ја сам само да се заиста повежу чворови међусобно - на оне које они заиста повезани - Ја не морам да идем и да кроз сигурни да су сви нуллс су тамо на одговарајућим местима. Почевши од корена, знам да лево дете је корен је 3. Знам да право дете је корен је 9. Након тога, једино друго дете које сам оставио да бринете је 3 Право дете, што је 6. У овом тренутку, све изгледа прилично добро. Ми ћемо избрисати неке од ових линија. Сада све изгледа прилично добро. Хајде да се вратимо на нашу спецификацији и видети шта треба да радимо. У овом тренутку, морамо да напише функција зове 'садржи' са прототип "боол садржи (инт вредност)". И ово садржи функција ће вратити истина  Ако дрво је указао на наш глобални корена променљиве  садржи вредност прешла у функцији и лажне другачије. Идемо напред и урадите то. Ово ће бити баш као лоокуп да смо урадили руком на иПад пре само мало. Хајде да увећате назад мало и померајте горе. Ми ћемо ставити ову функцију одмах изнад нашег главног функцији тако да ми не треба да урадимо било какав прототипова. Дакле, боол садржи (инт вредност). Ту смо. Ту је наша декларација општенаменским. Само да се уверите да ће ово саставити, Идем да иде напред и само га једнако врати фалсе. Сада ова функција једноставно неће урадити ништа и увек извештавају да вредност која тражимо није у дрвету. У овом тренутку, то је вероватно добра идеја - пошто смо написали гомилу кода и нисмо ни покушали тестирање ипак - да бисте се уверили да је све саставља. Постоји пар ствари које морамо да урадимо да би били сигурни да ће се то заправо компајлирати. Прво, да ли смо користили неке функције у било библиотекама које још нисмо укључени. Функције које смо до сада коришћени су маллоц, и онда смо такође користи ову врсту - овај тип нестандардни зове 'боол' - који је укључен у стандардну Боол заглавља датотеке. Ми дефинитивно желимо да садрже стандардне боол.х за Боол типа, и ми такође желимо да # садрже стандардне либ.х за стандардне библиотеке који укључују маллоц и фрее, и све то. Дакле, умањите, идемо да одустанем. Хајде да пробамо и уверите се да је то стварно урадио компилиране. Ми видимо да се то деси, тако да смо на правом путу. Хајде да отворимо бинари_трее.ц поново. Она саставља. Идемо доле и уверите се да смо убацили неке позиве нашим функција садржи - само да би се уверили да је то све лепо и добро. На пример, када смо радили неке лоокупс у нашем дрвету раније, ми смо покушали да потражите вредности 6, 10, и 1, а ми смо знали да је 6 био у дрвету, 10 није био у дрвету, а 1 није био у дрвету било. Хајде да користимо те позиве пробне као начин да схватим да ли је или није наша функција садржи ради. У циљу да се то уради, ја ћу користити принтф функцију, и ми ћемо да одштампате резултат позива да садржи. Идем да ставим у низу "садржи (% д) = зато што  ћемо утикача у вредности коју ћемо да тражимо, и =% с \ н ", и то користити као наше формата низа. Само ћемо да видимо - буквално штампају се на екрану - оно што изгледа као функције позива. Ово није заправо позив функције.  Ово је само ниска дизајниран да изгледа као функције позива. Сада ћемо да прикључите вредности. Ми ћемо покушати садржи у 6, и онда шта ћемо да урадимо је користити тај оператор тернарни. Хајде да видимо - садржи 6 - па, сада сам садржане 6 и ако садржи 6 је истина, стринг који ћемо послати формату карактер% с ће бити стринг "истина". Идемо помицати по мало. Иначе, ми желимо да пошаљете стринг "фалсе" ако садржи 6 повратак лажне. Ово је мало сумњиво изгледа, али претпостављам да би као илустрацију шта тернарни оператер изгледа, јер га нисмо видели неко време. Ово ће бити лепо, згодно начин да схватим да је наша функција садржи ради. Идем да се вратим у помицати на лево, и ја ћу да копирате и налепите ову линију неколико пута. То је променило неке од тих вредности око, тако да ће бити 1, а то ће бити 10. У овом тренутку имамо лепу садржи функцију. Имамо неке тестове, а ми ћемо видети да ли све ради. У овом тренутку смо написали још мало кода. Време је да се престане и уверите се да је све још увек саставља. Затворите напоље, а сада идемо покушајте да поново бинарну дрво. Па, изгледа да смо добили грешку, и ми имамо то експлицитно проглашења иф у библиотеку функцију. Изгледа да ћемо морати да уђемо и # инцлуде стандардио.х. И са тим, све треба да састави. Ми смо сви добро. Сада хајде да пробамо ради бинарно стабло и види шта се дешава. Овде смо, / бинари_трее., и видимо да је, као што смо очекивали - јер нисмо реализовали садржи још, односно, управо смо ставили у повратку лажном - видимо да је то само се враћа труе за све њих, тако да је све радио за највећи део прилично добро. Идемо назад и заиста спроведе садржи у овом тренутку. Идем да се померите надоле, увећали, и - запамтите, алгоритам који смо користили је да смо почели у основном чвору а затим и на сваком чвору на које наилазимо, ми радимо поређења, и на основу тог поређења можемо или прешли на леву детета или десне дете. Ово ће да изгледа веома слично код бинарне претраге које смо писали раније у року. Када смо почетак, ми знамо да желимо да држите на текућем чвору да гледамо, и тренутни чвор ће бити покренут до корена чвора. А сад, идемо да пролази кроз дрво, и запамтите да наш зауставна услов -  када смо радили кроз пример руком - када смо наишли нулл чвор, не када смо гледали на нулл детета, него када смо преселили у чвор у стаблу и установили да смо на нултом чвор. Ми ћемо прелазили док трен није једнака нулл. И шта ћемо да радимо? Ми ћемо тестирати ако (трен -> вредност == вредност), онда знамо да смо заиста смо нашли чвор који смо тражили. Дакле, овде можемо вратити истина. Иначе, ми желимо да видимо да ли или не је вредност мања од вредности. Ако тренутна чвора је вредност мања од вредности тражимо, ћемо да се креће на десно. Дакле, трен = трен -> ригхт_цхилд и иначе ћемо да се пресели у лево. трен = трен -> лефт_цхилд;. Прилично једноставно. Вероватно препознају петљу која изгледа врло слично овоме са бинарни тражи раније у року, осим онда бавили низак, средњи и висок. Ево, само морамо да погледамо тренутну вредност, тако да је лепо и једноставно. Хајде да проверимо да ли је овај код ради. Прво, уверите се саставља. Изгледа као да ради. Хајде да покушамо да ради. И заиста, исписује све што смо очекивали. Она проналази 6 у дрвету, не проналази 10, јер 10 није у дрвету, и не пронађу 1 или зато што 1 је такође није у дрвету. Цоол ствари. Добро. Хајде да се вратимо на нашу спецификацији и види шта је следеће. Сада жели да дода још неке чвора нашег дрвета. Она жели да дода 5, 2 и 8, и уверите се да је наш садржи код и даље ради као што је очекивано. Идемо да урадим. У овом тренутку, пре него поново ради тај досадне копирања и лепљења, хајде да напишемо функцију да заиста направили чвор. Ако се померите надоле, све до главног, видимо да смо радили ово веома сличне код изнова и изнова сваки пут да желимо да створи чвор. Хајде да напишемо функцију која ће заправо изгради чвор за нас и вратити га. Ја ћу да га зову буилд_ноде. Идем да се изгради чвор са одређеном вредношћу. Зоом овде. Прва ствар коју ћу урадити је заправо створи простор за чвор на гомили. Дакле, чвор * н = маллоц (сизеоф (чвор)) н -> вредност = вредност; и онда овде, ја ћу само да покрене сва поља бити одговарајуће вредности. И на самом крају, ми ћемо вратити нашу чвор. Добро. Једна ствар коју треба напоменути је да ову функцију овде ће вратити показивач на меморију која је била хеап-а издвојена. Шта је лепо о томе сада да овај чвор - морамо да се изјасни о гомили, јер ако га прогласила на стек не бисмо били у стању да то уради у овој функцији као што је овај. То сећање ће ићи ван домашаја и да ће бити неважећа ако смо покушали да му приступите касније. Пошто смо се проглашава хеап-а додељеног меморије, ћемо морати да брине да га ослободе касније за наш програм да не цури било меморију. Ми смо били Пунтинг на томе све друго у коду само ради једноставности у то време, али ако сте икада написати функцију која изгледа овако где имате - неки га зову маллоц или реаллоц унутра - желите да се уверите да сте ставили неку коментар овде да каже, хеј, знаш, враћа хеап-а додељеног чвор иницијализован са положен-вредности. А онда желите да се уверите да сте ставили у некој врсти напомену да каже позивалац мора да ослободи вратио меморију. На тај начин, ако неко икада иде и користи ту функцију, они знају да све што се вратим са те функције у неком тренутку ће морати да буду ослобођени. Под претпоставком да је све добро и добро овде, можемо да идемо доле у ​​наш код и замени све ове линије овде са позивима на наш израде чвора функцију. Урадимо то стварно брзо. Један део да ми не идемо на замени је овај део доле на дну где смо заправо жицом до чворове да укаже на другог, јер то не можемо да урадимо у нашој функцији. Али, хајде да урадимо корен = буилд_ноде (7); чвор * три = буилд_ноде (3); чвор * шест = буилд_ноде (6); чвор * девет = буилд_ноде (9);. И сада, ми смо такође желели да додате чворови за - чвор * пет = буилд_ноде (5); чвор * осам = буилд_ноде (8); и шта је била друга чвор? Идемо овде. Желели смо да се дода 2 - чвор * два = буилд_ноде (2);. Добро. У овом тренутку, ми знамо да имамо 7, 3, 9, и 6 Све виред се на одговарајући начин, али шта је 5, 8, и 2? Да би све у одговарајућем редоследу, знамо да су три право дете 6. Дакле, ако ћемо да се дода 5, 5, такође спада у десној страни стабла од чега 3 је корен, па 5 спада у левој дете од 6. Можемо да урадимо ово рекавши, шест -> лефт_цхилд = пет; и онда 8 припада као левог детета 9, па девет -> лефт_цхилд = осам; и онда 2 је лево дете од 3, тако да можемо то да урадимо овде - те -> лефт_цхилд = две;. Ако нисте сасвим пратите уз то, ја предлажем да га извуче себе. Добро. Хајде да спаси ово. Идемо напоље и уверите се саставља, и онда можемо додати на нашим садржи позиве. Изгледа као да је све још увек саставља. Идемо у и додајте у неким садржи позиве. Опет, ја ћу да урадим мало копије и пастом. Сада хајде да тражи 5, 8 и 2. Добро. Хајде уверите се да све ово изгледа добро и даље. Сјајно! Сачувај и отказ. Сада ћемо да направимо, састави, а сада идемо трчи. Из резултата, изгледа као да се све ради само лепо и добро. Сјајно! Дакле, сада имамо наше Цонтаинс функционишу написано. Идемо даље и почети да радимо на томе како да убаците чворови у стабло јер, као што смо то радили управо сада, ствари нису баш лепа. Ако се вратимо на спецификацији, нас тражи да напише функцију зове убаците - опет враћа боол тога да ли смо или нисмо стварно могли убаците чвор у стаблу - а онда је вредност да убаците у стабло је наведено као једини аргумент нашег инсерт функцију. Ми ћемо вратити труе ако смо заиста могли убацити чвора садржи вредност у стаблу, што значи да смо ми једно, имао довољно меморије, а онда два, тај чвор није већ постоје у дрвету од - Запамтите, ми нећемо имати дуплиране вредности у дрвету, само да би се ствари једноставно. Добро. Назад на коду. Отворите га. Увећање мало, а онда идите доле. Ставимо функцију уметања десно изнад садржи. Опет, то ће да се зове воид инсерт (инт вредност). Дајте му мало више простора, а онда, као подразумевано хајде да ставимо у замену лажном на самом крају. Сада доле на дну, идемо напред и уместо ручно изградњу чворова у главни себе и ожичење их да укаже на међусобно као и ми радимо, ћемо се ослонити на наше уписати функцију да се то уради. Нећемо се ослањају на наше уписати функцију да изгради цело стабло од нуле још увек, већ ћемо ослободити ових редова - ве'лл коментар од ових линија - да изгради чворове 5, 8, и 2. А уместо тога, ми ћемо убацити позиве наше инсерт функцији да бисте се уверили да је то заправо функционише. Идемо. Сада смо коментарисали из ове линије. Ми имамо само 7, 3, 9, и 6 у нашем дрвету у овом тренутку. Да бисте били сигурни да је ово све ради, можемо умањили, чине наш дрво бинарни, покрените га, и можемо видети да садржи нам сада говори да смо потпуно у праву - 5, 8 и 2 су више у стаблу. Вратите се у коду, и како ћемо да убаците? Сетите се шта смо радили када смо уствари били убацивању 5, 8, и 2 раније. Играли смо ту Плинко игру где смо почели у корену, сиђе на дрвету један по један по један док нисмо нашли одговарајуће јаз, а онда смо ожичен у чвор на одговарајућем месту. Ми ћемо урадити исту ствар. Ово је у основи као писање кода који смо користили у садржи функцију да пронађе место где чвор треба да буде, и онда ми ћемо само да убаците чвор тамо. Почнимо да ради. Дакле, имамо чвор * трен = корен; ми ћемо само да следите садржи код док нисмо сазнали да је не баш раде за нас. Ми ћемо проћи кроз дрво док је тренутна елеменат није нулл, и ако смо сазнали да је трен вредност једнака вредности коју покушавамо да убаците - добро, ово је један од случајева у којима нисмо били у стању да убаците чвор у дрво јер то значи да имамо дупликат вредност. Овде ми заправо идемо да се врати фалсе. Сада, иф трен је вредност мања од вредности, Сада знамо да смо прешли на праву  јер је вредност спада у десној половини наставног дрвета. У супротном, ми ћемо да се пресели у лево. То је у основи наше Цонтаинс функционише тамо. У овом тренутку, када смо завршили тај вхиле петљу, наш показивач трен ће бити усмерена на нулл Ако функција није већ вратио. Зато имате Цур на месту где желимо да убаците нови чвор. Оно што остаје да се уради је да се заиста изгради нови чвор, што можемо учинити прилично лако. Можемо користити нашу супер згодну буилд чвора функцију, и нешто што нисмо урадили раније - ми смо некако узео здраво за готово, али сада ћемо урадити само да се уверите - ћемо тестирати да бисте се уверили да је вредност вратио новом чвору заправо Не нулл, јер не желимо да почнете досезању тог меморије ако је нула. Можемо тестирати да бисте се уверили да је нова чвор није једнака нулл. Или уместо тога, можемо само да видимо да ли је заправо нула, и ако је нула, онда можемо само да се врати лажно рано. У овом тренутку, морамо да пошаљем нови чвор у свом одговарајућем месту у дрвету. Ако се осврнемо на главна и где смо заправо били изведена у вредности пре, видимо да начин на који су то радили када смо хтели да ставе 3 у дрвету године смо приступили леву дете корена. Када смо ставили 9 у стаблу, морали смо да приступите прави дете корена. Морали смо да имамо показивач на родитеља како би се ставио нову вредност у стабло. Листате уназад до уметање, то неће баш раде овде јер ми немамо показивач родитеља. Оно што желимо да буде у стању да урадите је да, у овом тренутку, Провери вредност овог родитеља и види - па, Боже, Ако родитељ је вредност мања од тренутне вредности, затим десно дете у родитеља треба да буде нови чвор; иначе, лево дете матичног требало да буде нови чвор. Али, ми немамо тај показивач родитеља сасвим још. Да би га добили, ми заправо морати да га пратимо како идемо кроз дрво и пронаћи одговарајућу место у нашој петљи изнад. Можемо учинити да до померања назад на врх наше убацити функције и праћење другог показивача променљиву зове родитеља. Идемо да га подесите једнак првобитно нулл, и онда сваки пут идемо кроз дрво, ћемо поставити показивач родитељ одговара тренутни показивач. Поставите родитељу једнаку трен. На овај начин, сваки пут кад прођем, ћемо обезбедити да се у садашњи показивач добија увећава родитељ показивач га следи - само један ниво виши од садашњег показивача у дрвету. То све изгледа прилично добро. Мислим да је једна ствар коју ћемо да подесите ово изгради чвор враћа нулл. Да би добили изгради чвор заиста успешно врате нулл, ћемо морати да мењате тај код јер овде, нисмо тестирали да се уверите да маллоц вратио важећу показивач. Дакле, ако је (н = НУЛЛ!), Онда - ако маллоц вратио важећу показивач, онда ћемо га покрене; У супротном, само ћемо вратити и да ће завршити враћа нулл за нас. Сада све изгледа прилично добро. Хајде да проверимо да ли се ово заиста саставља. Направи стабло бинарну, и ох, имамо неке ствари овде дешава. Имамо имплицитна декларација функције изгради чвор. Опет, са овим компајлера, ми ћемо почети на врху. Шта то треба да значи да зовем изгради чвор пре него што сам заправо сам то изјавио. Идемо назад на коду заиста брзо. Померите се надоле, и сигурно довољно, мој убаците функција је проглашен изнад израде чвора функцију, али ја покушавам да користи изградњу чвор унутар уметка. Ја идем у и цопи - а затим налепите буилд чвора начин функцију овде на врху. На тај начин, надамо се да ће се радити. Дајмо ово још једном. Сада је све саставља. Све је добро. Али, у овом тренутку, нисмо заправо звао нашу инсерт функцију. Ми само знамо да је саставља, па идемо у и ставио неке позиве за Хајде да то урадимо у нашој основној функцији. Овде смо коментарисали од 5, 8 и 2, и онда их нисмо жице горе доле. Хајде да направимо неке позиве за уметање, и идемо такође користе исту врсту ствари које смо користили када смо направили ове принтф позива да се уверите да је све то се правилно постављена. Идем да копирате и налепите, и уместо садржи ћемо да урадимо уметак. И уместо 6, 10, и 1, ми ћемо користити 5, 8, и 2. То ће, надам убаците 5, 8, и 2 у стаблу. Саставите. Све је добро. Сада смо заправо ћете покренути наш програм. Све вратио лажна. Дакле, 5, 8 и 2 није ишао, и изгледа као да Цонтаинс их нису пронашли било. Шта се дешава? Идемо умањили. Први проблем је био да убаци се чинило да се врати фалсе, и изгледа као да је то због тога што смо оставили у нашој повратка лажних позива, и заправо никада нису вратили истина. Можемо поставити то горе. Други проблем је, сада чак и ако то урадимо - сачувајте ово, отказ ово, покрените маке опет су га компајлирати, затим покрените га - видимо да је нешто друго десило овде. 5, 8 и 2 су још увек није нашао у дрвету. Дакле, шта се дешава? Хајде да погледамо ово у коду. Хајде да видимо да ли можемо да решимо ово. Почињемо са родитељ не буде нула. Ми смо поставили тренутни показивач једнак корена показивача, и ми ћемо радити свој пут доле кроз дрво. Ако је тренутни чвор није нулл, онда знамо да кренемо доле мало. Ми смо поставили наше матичне показивач да буде једнака тренутној показивача, Проверили вредности - ако су вредности исте смо се вратили лажна. Ако су вредности мање смо се преселили у праву; У супротном, преселили смо се у лево. Онда смо изградити чвор. Ја ћу увећали мало. И овде, ми ћемо покушати да пошаљем копију вредности бити исти. Шта се дешава? Хајде да видимо да ли евентуално Валгринд нам може дати наговештај. Ја волим да користим Валгринд само зато Валгринд веома брзо пролазе и каже вам ако постоје меморијске грешке. Када смо покренули Валгринд на коду, као што можете видети праву хере--Валгринд./бинари_трее--анд хит ентер. Ви видите да ми нисмо имали никакву грешку меморије, тако да изгледа као да је све у реду до сада. Ми имамо неке цурење меморије, што ми знамо, јер нисмо дешава да ослободи било који од наших чворова. Покушајмо ради ГДБ да видимо шта се заправо дешава. Урадићемо ГДБ / бинари_трее.. Он подигне баш фино. Хајде да поставите тачку на паузу уметком. Хајде да покренемо. Изгледа ми заправо никада није позвао уложак. Изгледа проблем је само да кад сам променио доле у ​​главни - свих ових принтф позиве из садржи - Заправо никада нисам променио ово назвати уметак. Сада хајде да пробам. Идемо саставити. Све изгледа добро тамо. Сада ћемо да покушамо да ради, да видим шта се дешава. Добро! Све изгледа прилично добро тамо. Коначна ствар да размишљају о је, да ли постоје случајеви ивице овог уметка? И испоставило се да је добро, једна ивица случај да је увек занимљиво да мислим о томе је, шта се дешава ако је ваш дрво је празна, а ви позовете овај инсерт функцију? Хоће ли радити? Па, хајде да га дају пробати. - Бинари_трее ц -. Начин ћемо тестирати ово, ми ћемо ићи на наше главне функције, и уместо жица тих чворова овако, ми ћемо само да коментаришем из целу ствар, и уместо жица уп себе чворова, заправо може само ићи напред и избрисати све ово. Ми ћемо учинити све да се убаци позив. Дакле, хајде да урадимо - уместо 5, 8 и 2, ми ћемо убацити 7, 3 и 9. А онда ћемо, такође ћете желети да убаците 6 као добро. Саве. Прекини. Нека стабла бинарну. Све саставља. Ми само можемо покренути га као и види шта се дешава, али то ће бити веома важно да се уверите да немамо никакве грешке меморије, јер је то једна од наших ивице предмета који знамо о томе. Хајде уверите се да добро ради под валгринд, што ћемо урадити само ради Валгринд / бинари_трее.. Изгледа као да заиста имају једну грешку из једног контекста - имамо ову сегментирања грешку. Шта се десило? Валгринд ствари нам говори где је. Умањите мало. Изгледа као да се дешава у нашем инсерт функцији, где имамо погрешну читање величине 4 на уметку, линија 60. Хајде да се вратимо и да видимо шта се дешава овде. Умањите заиста брзо. Желим да се уверите да се не иде до ивице екрана, тако да можемо видети све. Повуци да мало. Добро. Померите се надоле, а проблем је управо овде. Шта се дешава ако узмемо ствар и наш тренутни чвор је безвредно, наш чвор родитељ је нулл, па ако погледамо горе у самом врху, овде - ако је ово док је петља никада заправо врши јер је наша тренутна вредност је нула - наш корен је нулл тако трен је нулл - онда наш родитељ никада не бива постављен на вал или важећу вредност, тако, родитељ ће такође бити нула. Морамо се сетити да проверите да када смо добили овде, и ми почети приступу вредност овог родитеља. Дакле, шта се дешава? Па, ако родитељ није нулл - иф (родитељ == НУЛЛ) - онда знамо да не сме бити ништа у дрвету. Морамо покушати да га убаците у корену. Можемо учинити да је само постављањем корен једнак новом чвору. Онда у овом тренутку, ми у ствари не желим да идем кроз ове друге ствари. Уместо тога, овде, моземо урадити било друго-ако-друго, или бисмо могли комбиновати све овде у друго, али овде ћемо само други да користи и да га на тај начин. Сада ћемо да тестирамо да се уверите да наша матична није нулл пре тога заправо покушава да приступи поља. То ће нам помоћи да се избегне грешку сегментирања. Дакле, ми отказ, умањили, компајлирати, трчи. Нема грешке, али и даље имамо гомилу меморијских цурења јер нисмо ослободили ниједан од наших чворова. Али, ако одемо овде и гледамо нашу отиску, видимо да, добро, изгледа као и сви наши уметака су се враћали истинито, што је добро. У умеће су све истина, а затим одговарајуће садржи позиви су такође тачно. Добар посао! Изгледа да ћемо успешно сте написали уметак. То је све што имамо за проблем Подешавање овонедељном спецификацији. Један забаван изазов да размишљају о томе како заправо ће ићи у и без свих тачака у овом дрвету. Можемо да урадимо више различитих начина, али ћу оставити на вама да експериментишете, и као забаван изазов, пробајте и уверите се да можете да се уверите да овај извештај Валгринд враћа без грешке и нема цурења. Срећно на Хуффман овонедељном кодирање проблем сету, и видимо се следеће недеље! [ЦС50.ТВ]