[Powered by Google Translate] [بخش 7] [کمتر راحت]
[مقابله Hardison] [دانشگاه هاروارد]
[این CS50.] [CS50.TV]
>> خوش آمدید به بند 7.
با تشکر از طوفان شنی،
به جای داشتن یک بخش طبیعی این هفته،
ما در حال انجام این کار راه رفتن را از طریق، از طریق بخش از سوالات.
من قصد دارم به همراه با مشکل مجموعه 6 مشخصات،
و رفتن را از طریق تمام سوالات در
یک بخش از بخش پرسش و پاسخ.
در صورتی که هر گونه سوال وجود دارد،
لطفا ارسال این گفتگو CS50.
>> باشه. بیایید شروع کنیم.
در حال حاضر من به دنبال در صفحه 3 از مشخصات مشکل مجموعه.
ما در حال رفتن به اولین شروع به صحبت کردن در مورد درخت دودویی
پس از آن بسیاری از ارتباط به مجموعه مشکل این هفته -
رمزگذاری هافمن درخت.
یکی از اولین ساختارهای داده ای در مورد CS50 صحبت آرایه بود.
به یاد داشته باشید که یک آرایه است که دنباله ای از عناصر -
همه از همان نوع - در کنار یکدیگر در حافظه ذخیره می شود.
اگر من یک آرایه صحیح است که من می توانم با استفاده از این سبک جعبه، اعداد، اعداد صحیح جلب -
اجازه دهید بگویم که 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 صحبت می کنید،
و سپس اشاره گر فرزند چپ است که تهی، و یک اشاره گر حق کودک است که تهی.
ما هم می تواند NULL پایتخت در فضا برای نوشتن
هر دو فرزند چپ و فرزند راست، و یا ما می توانیم این علامت ممیز مورب رسم
از طریق هر یک از جعبه ها را به نشان می دهد که آن را تهی است.
من قصد دارم برای انجام این کار فقط به خاطر اینکه که ساده تر است.
چیزی که شما می بینید در اینجا دو روش رسم نمودار درخت دودویی گره بسیار ساده
جایی که ما به ارزش 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 و 3 پدر و مادر از 6 است. به آن بسیار نیست.
ما همچنین باید شرایط را برای صحبت در مورد پدربزرگ و مادربزرگ و نوه،
و به طور کلی ما در مورد اجداد
و فرزندان یک گره خاص است.
جد گره - یا اجداد، در عوض، از یک گره -
تمام گره های که در مسیر از ریشه به آن گره دروغ است.
برای مثال، اگر من به دنبال در 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 است، به طوری دوباره ما سعی می کنیم به حرکت به سمت چپ.
در این مرحله ما باید یک گره تهی، به طوری دوباره ما می توانیم شکست گزارش.
>> اگر شما نمی خواهید برای کسب اطلاعات بیشتر در مورد درخت دودویی،
یک دسته از مشکلات کمی سرگرم کننده است که شما می توانید با آنها انجام دهید وجود دارد.
من پیشنهاد می کنم تمرین نقاشی از این نمودار یک و یک
و پس از عبور از مراحل مختلف،
چرا که این فوق العاده مفید است
نه تنها هنگامی که شما در حال انجام مجموعه ای مشکل رمزگذاری هافمن
بلکه در دوره های آینده -
فقط یادگیری چگونه به قرعه کشی این ساختمان های داده و فکر می کنم از طریق مشکلات
با قلم و کاغذ و یا در این مورد، iPad و قلم.
>> هر چند در این نقطه، ما قصد داریم به حرکت در تمرین برنامه نویسی به
و در واقع با این درخت باینری بازی کنید و ببینید.
من قصد دارم به سوئیچ را به کامپیوتر من.
برای این قسمت از این بخش، به جای استفاده از CS50 اجرا و یا CS50 فضاهای،
من قصد دارم به استفاده از لوازم خانگی است.
>> پس همراه با مشخصات مشکل مجموعه،
من می بینم که من قرار است برای باز کردن دستگاه.
رفتن به پوشه My Dropbox به، ایجاد یک پوشه به نام بخش 7
و پس از آن یک فایل به نام binary_tree.c ایجاد کنید.
در اینجا ما بروید. من این دستگاه که در حال حاضر باز است.
من قصد دارم یک ترمینال را بالا بکشد.
من قصد دارم برای رفتن به پوشه Dropbox، یک پوشه به نام section7،
و ببینید که آن را کاملا خالی است.
در حال حاضر من قصد دارم برای باز کردن binary_tree.c.
باشه. در اینجا ما - فایل خالی است.
>> بازگشت به مشخصات.
خصوصیات می پرسد برای ایجاد یک تعریف نوع جدید
یک گره درخت باینری حاوی مقادیر نوع int -
درست مثل ارزش هایی که ما را در رسم نمودار ما قبل را به خود جلب کرد.
ما در حال رفتن به استفاده از این boilerplate typedef که ما را به حق در اینجا انجام داده ام
که شما باید از مجموعه مشکل 5 تشخیص -
اگر شما این راه جدول هش از برنامه املاء فتح.
شما همچنین باید آن را از بخش هفته گذشته را به رسمیت
جایی که ما در مورد لیست های پیوندی صحبت کردیم.
ما باید این typedef گره ساختار،
و ما با توجه به این گره ساختار این نام از گره ساختار را از قبل
به طوری که ما پس از آن می توانید به آن مراجعه کنید از آنجایی که ما می خواهم به ساختار اشاره گر گره
به عنوان بخشی از ساختار ما، اما ما پس از آن محاصره این -
یا نه، محصور این - در یک typedef
به طوری که، بعد از آن در کد، ما می توانیم به این ساختار به عنوان تنها یک گره به جای گره ساختار مراجعه کنید.
>> که این امر بسیار شبیه به تعریف لیست به تنهایی مرتبط است که در هفته گذشته ما شاهد.
برای انجام این کار، اجازه دهید فقط با نوشتن boilerplate شروع.
ما می دانیم که ما باید یک مقدار عدد صحیح،
بنابراین ما باید در ارزش داده int قرار داده است، و پس از آن به جای داشتن فقط یک اشاره گر به عنصر بعدی -
همانطور که ما با تنهایی مرتبط با لیست -
ما در حال رفتن به اشاره گر چپ و راست کودک است.
که بسیار ساده بیش از حد - ساختار گره * چپ کودک؛
و ساختار گره * فرزند راست. دانلود.
که به نظر می رسد مثل یک شروع خیلی خوب است.
بازگشت به مشخصات.
>> در حال حاضر ما نیاز به اعلام جهانی متغیر * گره ریشه یک درخت.
ما در حال رفتن به این جهانی درست مثل ما اشاره گر اول ما در لیست پیوندی نیز جهانی ساخته شده است.
این بود به طوری که در توابع است که می نویسیم
ما لازم نیست که برای عبور در اطراف این ریشه -
هر چند خواهیم دید که اگر شما می خواهید برای نوشتن این توابع بازگشتی،
بهتر است حتی به عبور در اطراف آن به عنوان یک جهانی در وهله اول
و در عوض آن را به صورت محلی در تابع اصلی خود را مقداردهی اولیه.
اما، ما آن را در سطح جهانی برای شروع.
باز هم، ما می خواهیم یک زن و شوهر از فضاهای بدهد، و من قصد دارم به اعلام یک ریشه * گره.
فقط مطمئن شوید که من ترک این مقدار دهی نکردن، من قصد دارم به آن را برابر تهی است.
در حال حاضر، در تابع اصلی - که ما آن را خواهم نوشت واقعا به سرعت در اینجا -
اعضای هیات تحریریه اصلی (argc هوشمند، توایع کاراکتر * ی argv []) -
و من قصد دارم برای شروع به اعلام آرایه ی argv من به عنوان ثابت به طوری که من می دانم
که کسانی که استدلال استدلال که من احتمالا نمی خواهید را تغییر دهید.
اگر من می خواهم به آنها را تغییر دهید، احتمالا باید ساخت نسخه از آنها را.
شما خواهید دید زیادی در کد.
خوب در هر صورت. این خوب است برای ترک آن به عنوان - حذف توایع اگر شما می خواهم.
من معمولا آن را در قرار دادن فقط طوری که خودم را به یاد من
که من احتمالا نمی خواهید به تغییر آن استدلال است.
>> مثل همیشه، من قصد دارم که شامل این بازگشت 0 خط در پایان اصلی است.
در اینجا، من به گره ریشه مقداردهی اولیه.
همانطور که می ایستد در حال حاضر، من به یک اشاره گر است که به تهی،
پس از آن با اشاره به هیچ چیز.
در واقع به منظور ایجاد گره،
من برای اولین بار نیاز به تخصیص حافظه برای آن.
من قصد دارم برای انجام این کار را با ساخت حافظه در پشته را با استفاده از malloc.
من قصد دارم به تعیین ریشه برابر از malloc به نتیجه،
و من می خواهم به استفاده از عملگر sizeof برای محاسبه اندازه یک گره است.
این دلیل است که من استفاده از گره sizeof به عنوان مخالف، می گویند،
انجام چیزی شبیه به این - malloc (4 + 4 +4) یا malloc 12 -
چون من می خواهم کد که ممکن است به عنوان سازگار است.
من می خواهم که قادر به گرفتن این فایل C، آن را کامپایل بر روی لوازم خانگی،
و سپس آن را در من 64 بیتی مک کامپایل -
و یا بر روی یک معماری کاملا متفاوت -
و من می خواهم این همه به کار همان است.
>> اگر من فرضیات در مورد اندازه متغیرها -
اندازه یک int و یا به اندازه یک اشاره گر -
پس من هم فرضیات در مورد انواع معماری
که در آن کد می تواند با موفقیت کامپایل کردن در زمان اجرا است.
همیشه sizeof به عنوان مخالف به صورت دستی جمع زمینه های ساختار استفاده کنید.
دلیل دیگر این است که نیز ممکن است وجود داشته باشد بالشتک که کامپایلر به ساختار قرار می دهد.
حتی جمع زمینه های فردی چیزی است که شما معمولا می خواهید به انجام این کار نیست،
بنابراین، استفاده حذف این خط.
در حال حاضر، واقعا این گره ریشه مقداردهی اولیه،
من قصد دارم که به برق وصل کردن در مقادیر برای هر یک از زمینه های مختلف خود را.
به عنوان مثال، برای ارزش من می دانم که من می خواهم به مقداردهی اولیه تا 7،
و در حال حاضر من قصد دارم مجموعه ای کودک سمت چپ را تهی می شود
و فرزند راست را نیز تهی باشد. بزرگ!
ما انجام داده ایم که بخشی از تنظیمات است.
>> مشخصات در پایین صفحه 3 از من می پرسد برای ایجاد سه گره -
شامل 3، یکی حاوی 6، و یکی با 9 -
و سپس آنها را سیم پس از آن دقیقا مانند نمودار درختی ما به نظر می رسد
که صحبت کردیم قبلا.
اجازه دهید که خیلی سریع در اینجا.
شما واقعا به سرعت خواهید دید که من قصد دارم شروع به نوشتن یک دسته از کد های تکراری.
من قصد دارم برای ایجاد یک گره * و من قصد دارم به سه.
من قصد دارم آن را به malloc (sizeof (گره)) برابر است.
من قصد دارم مجموعه ای از سه> = مقدار 3.
سه -> left_child = NULL سه - راست _child = NULL؛ نیز هست.
که به نظر می رسد بسیار شبیه به مقدار دهی اولیه ریشه، و این دقیقا همان چیزی است که
من قصد دارم که باید به انجام اگر من شروع به مقدار دهی اولیه 6 و 9 و همچنین.
من که واقعا به سرعت در اینجا انجام دهید - در واقع، من قصد دارم برای انجام یک کپی و چسباندن کمی،
و مطمئن شوید که I - خوبه.
در حال حاضر، من آن کپی کردم و من می توانید پیش بروید و این مجموعه برابر با 6 است.
شما می توانید ببینید که این مدتی طول می کشد و فوق العاده کارآمد نیست.
فقط یک کمی، ما می خواهیم یک تابع است که این کار را برای ما انجام می دهید را بنویسید.
من می خواهم برای جایگزینی این با 9، جایگزین که با 6.
>> حالا ما همه از گره های ما ایجاد و مقداردهی اولیه.
ما باید ریشه ما را تا 7 برابر است، و یا حاوی ارزش 7،
گره حاوی 3، گره حاوی 6، و گره حاوی 9.
در این مرحله، همه ما را مجبور به انجام همه چیز سیم تا است.
دلیل من مقداردهی اولیه اشاره گر تهی است، به طوری که من مطمئن شوید که را
من هیچ اشاره گرها مقدار دهی نکردن در آن وجود دارد تصادف ندارد.
و دیگر اینکه، در این نقطه، من فقط باید به واقع اتصال گره ها به یکدیگر -
به آنهایی است که آنها در واقع به هم متصل شود - من مجبور به رفتن را از طریق ایجاد
مطمئن شوید که همه نقاط صفر در آن وجود دارد در مکان های مناسب هستند.
>> شروع در ریشه، من می دانم که فرزند چپ ریشه 3.
من می دانم که فرزند راست ریشه 9.
پس از آن، تنها فرزند دیگر که من را ترک کرده اند به نگرانی در مورد
کودک سمت راست 3، که 6 است.
در این مرحله، آن همه به نظر می رسد خیلی خوب است.
خواهیم برخی از این خطوط را حذف کنید.
در حال حاضر همه چیز خیلی خوب به نظر می رسد.
بازگشت به ویژگی های کار ما و آنچه که ما باید انجام دهیم بعدی.
>> در این مرحله، ما مجبور به نوشتن یک تابع به نام 'شامل'
با یک نمونه حاوی بولی (ارزش بین المللی).
و این شامل تابع درست به بازگشت
اگر درخت را به متغیر ریشه های ما در جهانی اشاره کرد
حاوی مقدار منتقل شده به تابع و در غیر این صورت نادرست است.
اجازه دهید به جلو و انجام این کار.
این امر دقیقا مانند مراجعه به که ما با دست فقط کمی از iPad پیش می شود.
بیایید زوم در کمی و تا رفته.
ما در حال رفتن به قرار دادن این تابع بالا تابع اصلی ما
به طوری که ما مجبور به انجام هر نوع نمونه.
بنابراین، بولی شامل (ارزش بین المللی).
وجود دارد بروید. اعلامیه boilerplate ما وجود دارد.
فقط مطمئن شوید که این کامپایل،
من قصد دارم به جلو بروید و فقط آن را برابر با بازگشت به نادرست.
در حال حاضر این تابع فقط می خواهد هر چیزی را انجام ندهید و همیشه گزارش می کنند که
ارزش است که ما به دنبال این است که در درخت نیست.
>> در این مرحله، آن را احتمالا ایده خوبی است -
از آنجایی که ما از یک دسته کامل از کد نوشته شده و در حال حاضر حتی سعی آزمایش هنوز -
تا مطمئن شوید که آن را کامپایل.
یک زن و شوهر از چیزهایی که ما باید انجام دهید تا مطمئن شوید که این در واقع کامپایل وجود دارد.
اول، اگر بوده ایم با استفاده از هر عملکرد در هر کتابخانه است که ما هنوز گنجانده نشده است.
توابع ما استفاده کرده ایم تا کنون malloc،
ایم و پس از آن نیز شده است با استفاده از این نوع - این نوع غیراستاندارد به نام 'bool' -
است که در فایل هدر بولی استاندارد گنجانده شده است.
ما قطعا می خواهید به bool.h استاندارد برای نوع بولی،
و ما همچنین می خواهم به # lib.h استاندارد برای کتابخانه استاندارد
که عبارتند از malloc، و رایگان، و همه از آن.
بنابراین، زوم کردن، ما قصد داریم به ترک.
بیایید امتحان کنید و مطمئن شوید که این واقعا کامپایل.
ما می بینیم که آن را ندارد، و لذا ما در مسیر درست هستیم.
>> اجازه باز کردن binary_tree.c دوباره.
کامپایل. بیایید بروید و مطمئن شوید که برخی از مکالمات ما وارد به عملکرد ما شامل -
فقط مطمئن شوید که این همه خوبی و خوب است.
به عنوان مثال، زمانی که ما برخی از متغیر در درخت ما را پیش از آن،
ما سعی کردیم به نگاه کردن به 6 ارزش ها، 10 و 1، و ما می دانستیم که 6 در درخت،
10 در درخت نیست، و (1) در درخت یا.
بیایید از کسانی که خواستار نمونه به عنوان راهی برای کشف کردن اینکه آیا یا نه
عملکرد ما شامل به کار است.
به منظور انجام این کار، من قصد دارم برای استفاده از تابع printf،
و ما قصد داریم برای چاپ کردن و در نتیجه تماس شامل.
من قصد دارم در یک رشته قرار داده است "شامل (٪ D) = به دلیل
ما قصد داریم به پلاگین در ارزش است که ما قصد داریم به دنبال،
و =٪ S \ N "و استفاده از آن به عنوان رشته قالب ما.
ما فقط رفتن به - به معنای واقعی کلمه از چاپ بر روی صفحه نمایش -
آنچه به نظر می رسد مثل یک فراخوانی تابع است.
این است که در واقع فراخوانی تابع است.
این فقط رشته طراحی به مانند یک فراخوانی تابع است.
>> در حال حاضر، ما در حال رفتن به در ارزش وصل است.
ما رفتن را امتحان شامل در 6،
و سپس آنچه ما قصد داریم در اینجا به انجام این است که استفاده از این عملگر سه تایی.
بیایید ببینید - شامل 6 - بنابراین، در حال حاضر من ام موجود 6 و اگر شامل 6 درست است،
رشته ای که ما قصد داریم به ارسال به کاراکتر فرمت٪ s را
رفتن به رشته ی "واقعی" است.
بیایید بیش از یک کمی حرکت کنید.
در غیر این صورت، ما می خواهیم برای ارسال رشته "نادرست" اگر شامل 6 مقدار false برگرداند.
این است که کمی مسخره به دنبال، اما من شکل من به عنوان ممکن است به خوبی نشان می دهد
اپراتور سه تایی به نظر می رسد از آنجایی که ما آن را برای مدتی دیده نمی شود.
این خواهد بود که خوب، راهی برای کشف کردن اگر تابع ما شامل کار.
من قصد دارم برای حرکت را به سمت چپ،
و من قصد دارم به این خط را کپی کنید و چند بار.
آن را تغییر برخی از این ارزش ها در اطراف
پس این است که رفتن به (1)، و این است که رفتن به 10 است.
>> در این مرحله ما باید یک تابع شامل خوب است.
ما باید برخی از آزمون ها، و خواهیم دید که اگر این همه کار می کند.
در این نقطه نوشته ایم کد برخی بیشتر.
زمان برای ترک و مطمئن شوید که همه چیز هنوز کامپایل.
ترک، و حالا سعی کنید ساخت درخت دودویی دوباره.
خب، به نظر می رسد که ما باید یک خطا،
و ما این را به صراحت اعلام تابع کتابخانه printf است.
به نظر می رسد که ما نیاز به رفتن به در و # شامل standardio.h.
و با آن، همه چیز را باید کامپایل. همه ما خوب است.
در حال حاضر درخت دودویی را در حال اجرا کنید و ببینید که چه اتفاقی می افتد.
در اینجا ما هستند، / binary_tree،
و ما می بینیم که، همانطور که ما انتظار می رود -
از آنجا که ما به پیاده سازی نیست شامل با این حال،
یا نه، ما فقط در بازگشت به غلط قرار داده است -
ما می بینیم که آن را تنها بازگشت به نادرست برای همه آنها،
به طوری که تمام کار در بیشتر قسمت ها نسبتا خوب است.
>> اجازه بازگشت و در واقع پیاده سازی شامل در این نقطه است.
من قصد دارم برای حرکت کردن، زوم در، و -
به یاد داشته باشید، الگوریتم است که ما با استفاده از این بود که ما در گره ریشه آغاز شده
و پس از آن در هر گره که ما روبرو می شوند، ما می توانم در یک مقایسه،
و بر اساس این مقایسه ما یا به کودک سمت چپ و یا به کودک حق حرکت می کند.
این است که رفتن به نگاه بسیار شبیه به کد دودویی جستجو که ما نوشت: پیش از آن در کوتاه مدت است.
هنگامی که ما شروع کردن، ما می دانیم که ما می خواهیم به گره فعلی
که ما به دنبال، و گره در حال حاضر در حال رفتن به مقداردهی اولیه به گره ریشه است.
و در حال حاضر، ما در حال رفتن به رفتن را از طریق درخت،
و به یاد داشته باشید که شرط توقف ما -
هنگامی که ما در واقع از طریق مثال با دست کار می کرد -
زمانی بود که ما یک گره تهی مواجه می شوند،
زمانی که ما در یک کودک تهی نگاه نمی کند،
بلکه هنگامی که ما در واقع به یک گره در درخت نقل مکان کرد
و نشان داد که ما در یک گره تهی هستید.
ما قصد داریم به تکرار تا زمانی فعلی برابر است برای تهی نیست.
و چه می خواهیم کاری انجام دهید؟
ما قصد داریم به صورت تست (فعلی -> مقدار ==)،
پس از آن ما می دانیم که ما در واقع گره است که ما به دنبال.
بنابراین در اینجا، ما می توانیم بازگشت درست است.
در غیر این صورت، ما می خواهم برای دیدن یا نه مقدار کمتر از مقدار است.
اگر مقدار گره فعلی را کمتر از ارزش ما به دنبال،
ما قصد داریم برای حرکت به سمت راست.
بنابراین، فعلی فعلی = -> right_child، و در غیر این صورت، ما در حال رفتن به حرکت به سمت چپ.
فعلی فعلی = -> left_child. خیلی ساده است.
>> شما احتمالا حلقه است که به نظر می رسد بسیار شبیه به این را از به رسمیت
جستجوی دودویی پیش از آن در کوتاه مدت، به جز آن که ما با کم، متوسط، بالا و خرید و فروش شد.
در اینجا، ما فقط باید به ارزش فعلی نگاه کنید،
پس از آن خوب و ساده است.
بیایید مطمئن شوید که این کد در حال کار است.
اول، مطمئن شوید که آن را کامپایل. به نظر می رسد مانند آن را ندارد.
بیایید سعی کنید با اجرای آن.
و در واقع، آن را چاپ کردن هر چیزی است که ما انتظار می رود.
می یابد 6 در درخت، آیا 10 مشاهده نمی کند چرا که 10 در درخت نیست،
می کند و 1 را پیدا کند یا به این دلیل 1 نیز در درخت نیست.
چیزهای باحال.
>> باشه. بازگشت به ویژگی های کار ما و ببینید چه چیزی در آینده.
در حال حاضر، آن را می خواهد برای اضافه کردن گره برخی بیشتر به درخت.
می خواهد برای اضافه کردن 5، 2 و 8، و مطمئن شوید که حاوی کد
هنوز هم با این نسخهها کار به عنوان انتظار می رود.
بیایید به انجام این کار.
در این مرحله، به جای انجام این کار کپی مزاحم و چسباندن دوباره،
اجازه دهید ارسال یک تابع در واقع ایجاد یک گره است.
اگر ما تمام راه را در پایین حرکت به اصلی، ما می بینیم که ما در حال انجام این کار
کد بسیار مشابه بارها و بارها هر بار که ما می خواهیم به ایجاد یک گره است.
>> اجازه نوشتن یک تابع است که در واقع ساختن یک گره را برای ما و بازگشت از آن.
من قصد دارم به آن build_node.
من قصد دارم برای ساخت یک گره را با یک مقدار خاص است.
بزرگنمایی در اینجا.
اولین چیزی که من قصد دارم برای انجام این کار است که در واقع فضا برای گره در پشته ایجاد کنید.
بنابراین، گره * N = malloc (sizeof (گره))؛ N -> ارزش = ارزش؛
و سپس در اینجا، من فقط رفتن به مقداردهی اولیه تمام مزارع را به مقادیر مناسب.
و در پایان، ما می خواهیم گره ما بازگشت.
باشه. یک چیز را به یاد داشته باشید این است که این تابع در اینجا
در حال رفتن به یک اشاره گر به حافظه است که پشته اختصاص.
چه خوب است در این مورد این است که این گره در حال حاضر -
ما باید آن را بر روی پشته اعلام زیرا اگر ما آن را بر روی پشته اعلام کرد
ما قادر نخواهد بود آن را در این تابع شبیه به این انجام دهد.
که حافظه را خارج از محدوده
خواهد بود و نامعتبر است و اگر ما سعی به آن دسترسی داشته باشید بعد در.
از آنجا که ما در حال اعلام پشته حافظه تخصیص داده شده،
ما در حال رفتن به برای مراقبت از آزادی آن را بعدا
برنامه های ما را به هر حافظه نشت نیست.
ما شده ایم punting که برای هر چیز دیگری در کد
فقط به خاطر سادگی در آن زمان،
اما اگر شما همیشه یک تابع است که به نظر می رسد مثل این ارسال
جایی که شما رو - برخی آن را malloc یا بازتخصیص داخل -
شما می خواهید مطمئن شوید که شما را برخی از مرتب کردن بر اساس از نظر تا اینجا که می گوید،
با سلام، شما می دانید، یک گره پشته اختصاص مقداردهی اولیه با ارزش گذشته در را بر می گرداند.
و پس از آن شما می خواهید مطمئن شوید که شما را در برخی از مرتب کردن بر اساس توجه داشته باشید که می گوید قرار داده است
تماس گیرنده باید به حافظه برگردانده شده را آزاد کند.
به این ترتیب، اگر کسی تا کنون می رود و با استفاده از این تابع،
آنها می دانند که هر آنچه که آنها از آن تابع
در برخی از نقطه باید آزاد است.
>> با فرض این که همه به خوبی و خوب،
ما می توانیم به پایین را به کد و جایگزین همه از این خطوط در اینجا
با تماس به تابع گره بسازیم.
اجازه دهید که واقعا به سرعت.
یک بخش است که ما قصد داریم به جایگزین این بخش را در اینجا
در پایین جایی که ما در واقع سیم گره به نقطه را به یکدیگر،
چرا که ما نمی توانیم در عملکرد ما است.
اما اجازه دهید گره ریشه = build_node (7)؛ * سه = build_node (3)؛
گره: * شش = build_node (6)؛ گره * نه = build_node (9)؛ است.
و در حال حاضر، ما همچنین می خواستم برای اضافه کردن گره -
گره * پنج = build_node (5)؛ گره * 8 = build_node (8)؛
و چه گره دیگر؟ اجازه دهید اینجا را ببینید. ما می خواستیم را نیز اضافه کردن به 2 -
گره * دو = build_node (2)؛
باشه. در این مرحله، ما می دانیم که ما باید 7، 3،، 9 و 6
تمام سیمی مناسب است، اما آنچه در مورد 5، 8، و 2؟
برای نگه داشتن همه چیز را در جهت مناسب،
ما می دانیم که فرزند راست سه 6.
بنابراین، اگر ما در حال رفتن به از 5،
5 همچنین در سمت راست درخت، 3 ریشه به آن تعلق دارد،
تا 5 به آن تعلق دارد به عنوان فرزند چپ 6.
ما می توانیم این کار را با گفتن، شش -> left_child = پنج
و پس از آن از 8 به آن تعلق دارد به عنوان فرزند چپ از 9، پس نه -> left_child = هشت؛
و پس از آن 2 فرزند چپ از 3 است، بنابراین ما می توانیم که در اینجا انجام - تو -> left_child = دو.
اگر شما کاملا به دنبال همراه با آن، من پیشنهاد می کنم آن را رسم شما از خودتان.
>> باشه. بیایید نجات این. بیایید بیرون بروید و مطمئن شوید که آن را کامپایل،
و پس از آن ما می توانیم در ما شامل تماس اضافه کنید.
به نظر می رسد مثل هر چیز هنوز کامپایل است.
بیایید و اضافه کردن در برخی شامل تماس.
باز هم، من قصد دارم برای انجام یک کمی از کپی کردن و چسباندن.
حالا اجازه دهید به مدت 5، 8، و 2 را جستجو کنید. باشه.
اطمینان حاصل کنید که این همه خوب به نظر می رسد هنوز هم بیایید. بزرگ! ذخیره و ترک.
حالا را، تدوین، و در حال حاضر اجازه اجرا است.
از نتایج به دست آمده، به نظر می رسد که همه چیز در حال کار فقط خوب و به خوبی.
بزرگ! بنابراین در حال حاضر ما باید حاوی تابع نوشته شده است.
اجازه دهید و شروع به کار بر روی چگونه برای وارد کردن یک گره به درخت
از آنجا که، همانطور که ما در حال انجام آن را در حال حاضر، همه چیز خیلی زیبا نیست.
>> اگر ما بازگشت به مشخصات،
از ما می خواهد برای نوشتن یک تابع به نام درج - دوباره، بازگشت بولی
یا نه ما در واقع می تواند گره به درخت وارد -
و پس از آن مقدار برای وارد کردن به درخت است مشخص
تنها آرگومان به تابع قرار دادن ما در زمان حال می باشد.
ما باز خواهد گشت اگر ما در واقع می تواند درج حاوی مقدار گره به درخت،
که بدان معنی است که ما، یکی، تا به حال حافظه به اندازه کافی،
و پس از آن دو، که گره در درخت از سال در حال حاضر وجود ندارد -
به یاد داشته باشید، ما می رویم نه به ارزش های تکراری در درخت، فقط به چیزهای کوچک و ساده است.
باشه. برگشت به کد.
باز. بزرگنمایی در یک بیت، پس از آن به پایین حرکت کنید.
بیایید تابع قرار دادن درست بالای شامل.
باز هم، آن را برای رفتن به درج بولی نامیده می شود (ارزش بین المللی).
فضای کمی بیشتر، و پس از آن، به عنوان یک پیش فرض،
اجازه دهید قرار در بازگشت غلط در پایان.
در حال حاضر به پایین در پایین، اجازه دهید به جلو بروید و به جای آن از ساخت دستی گره
اصلی در خودمان و سیم کشی آنها را به نقطه را به یکدیگر مانند ما انجام می دهیم،
ما را در تابع قرار دادن ما تکیه به انجام این کار شده است.
ما نمی خواهد با تکیه بر تابع قرار دادن ما از ابتدا کل درخت را به ساخت درست نشده است،
بلکه ما رو از شر این خطوط - we'll دیدگاه خود را از این خطوط -
که برای ساختن گره از 5، 8، و 2.
و در عوض، می کنیم فراخوانی به تابع قرار دادن ما وارد
تا مطمئن شوید که در واقع کار می کند.
در اینجا ما بروید.
>> در حال حاضر ما از نظر این خطوط است.
ما فقط باید 7، 3، 9 و 6 در درخت ما در این نقطه است.
برای مطمئن شوید که که که این همه کار،
ما می توانید با زوم کردن، ایجاد درخت باینری ما
آن را اجرا کنید، و ما می توانید ببینید که شامل در حال حاضر ما می گوید که ما کاملا راست -
5، 8، و 2 دیگر در درخت.
بازگشت به کد
و چگونه می خواهیم برای وارد کردن؟
به یاد داشته باشید آنچه که ما در زمانی که ما در واقع قرار دادن شدند 5، 8، و 2 قبلا.
ما در بازی که بازی Plinko جایی که ما در ریشه آغاز شده است،
رفت یک درخت یک به یک
تا زمانی که ما متوجه شدیم که فاصله مناسب،
و پس از آن ما در نقطه ای مناسب در گره سیمی.
ما قصد داریم برای انجام کار مشابه است.
این است که اساسا مثل نوشتن کد است که ما با استفاده از شامل تابع
برای پیدا کردن نقطه ای که در آن گره باید،
و پس از آن ما فقط رفتن به درج گره در سمت راست وجود دارد.
بیایید شروع به انجام این کار است.
>> بنابراین ما باید یک گره فعلی = ریشه، ما فقط به دنبال حاوی کد
تا زمانی که ما می یابند که آن را برای ما کاملا کار نمی کند.
ما قصد داریم تا از طریق درخت، در حالی که عنصر فعلی تهی نیست،
و اگر ما ارزش است که فعلی برابر است با ارزش است که ما در حال تلاش برای وارد کردن -
خوب، این یکی از موارد است که در آن ما در واقع می تواند به قرار دادن گره است
به درخت به دلیل این معنی است که ما باید یک مقدار تکراری می باشد.
در اینجا ما در واقع رفتن به بازگشت غلط است.
در حال حاضر، اگر دیگری ارزش فعلی کمتر از ارزش است،
در حال حاضر ما می دانیم که ما را به سمت راست حرکت می کند
زیرا مقدار به آن تعلق دارد در نیمه سمت راست درخت فعلی است.
در غیر این صورت، ما در حال رفتن به حرکت به سمت چپ.
که اساسا حاوی ما تابع سمت راست وجود دارد.
>> در این نقطه، زمانی که ما را در تکمیل این حلقه در حالی که،
اشاره گر فعلی ما این است که برای رفتن به اشاره به تهی
اگر تابع در حال حاضر بازگشته است.
بنابراین ما در حال فعلی در نقطه که در آن ما می خواهیم به درج گره جدید است.
چه باقی مانده است که باید انجام شود این است که در واقع ساخت گره جدید
که ما خیلی به راحتی می توانید انجام دهید.
ما می تواند فوق العاده مفید ساخت تابع گره استفاده کنید،
و چیزی است که ما انجام نمی زودتر -
ما فقط به نوعی در زمان اعطا شده اما در حال حاضر ما خواهید انجام دهید فقط به مطمئن شوید که -
تست می کنیم تا مطمئن شوید که مقدار بازگردانده شده توسط گره جدید در واقع
تهی نیست، چرا که ما نمی خواهیم برای شروع به دسترسی که حافظه آن است که اگر تهی.
ما می توانیم آزمایش مطمئن شوید که گره برابر است به تهی نیست.
یا به جای آن، ما فقط می توانید در صورتی که آن را در واقع تهی،
و اگر آن را تهی است، پس از آن ما فقط می تواند بازگشت کاذب زود.
>> در این مرحله، ما باید به سیم گره جدید را به نقطه مناسب خود را در درخت می باشد.
اگر ما نگاه پشت در اصلی و جایی که ما در واقع سیم کشی در ارزشها قبل از،
ما می بینیم که ما آن را انجام می دهند که ما می خواستیم برای قرار دادن 3 در درخت
شد دیده فرزند چپ ریشه است.
هنگامی که ما 9 در درخت قرار داده است، ما تا به حال برای دسترسی به فرزند راست ریشه.
ما تا به حال به یک اشاره گر به پدر و مادر در جهت قرار دادن یک مقدار جدید را به درخت.
اسکرول به بالا و برای وارد کردن، که قصد ندارم تا کاملا کار در اینجا
چرا که ما یک اشاره گر پدر و مادر ندارد.
آنچه ما می خواهیم قادر به انجام می باشد، در این مرحله،
بررسی ارزش پدر و مادر و ببینید - خب، خدای من،
اگر ارزش پدر و مادر است کمتر از ارزش فعلی،
سپس فرزند حق پدر و مادر باید گره جدید؛
در غیر این صورت، کودک سمت چپ از پدر و مادر باید به گره جدید است.
اما ما این کار اشاره گر پدر و مادر ندارد کاملا رتبهدهی نشده است.
>> به منظور آن را دریافت کند، ما در واقع رفتن به آن را پیگیری ما از طریق درخت
و پیدا کردن نقطه مناسب در حلقه ما بالا است.
ما می توانیم با استفاده از پیمایش بازگشت به بالا تابع درج ما
و ردیابی یکی دیگر از متغیر اشاره گر به نام پدر و مادر.
ما در حال رفتن به آن را برابر به تهی در ابتدا،
و پس از آن هر زمان که ما از طریق درخت،
ما قصد داریم به مجموعه ای از اشاره گر برای مطابقت با پدر و مادر اشاره گر جاری است.
پدر و مادر برابر است با فعلی تنظیم کنید.
به این ترتیب، در هر زمان که ما از طریق آن به،
ما قصد داریم تا اطمینان حاصل شود که به عنوان اشاره گر جاری می شود افزایش مییابد
اشاره گر پدر و مادر آن را - فقط یک سطح بالاتر از اشاره گر فعلی در درخت است.
که همه خیلی خوب به نظر می رسد.
>> من فکر می کنم آن چیزی است که ما می خواهید برای تنظیم این ساخت گره تهی بازگشت.
به منظور ساخت گره در واقع با موفقیت بازگشت تهی،
ما باید این کد را تغییر دهید،
چرا که در اینجا، ما آزمایش هرگز تا مطمئن شوید که malloc بازگشت اشاره گر معتبر است.
بنابراین، اگر (n = تهی)، و سپس -
اگر malloc بازگشت اشاره گر معتبر است، پس ما آن را مقداردهی اولیه؛
در غیر این صورت، ما فقط و بازگشت است که بازگشت به تهی برای ما به پایان خواهد رسید.
در حال حاضر همه به نظر می رسد خیلی خوب است. اجازه بدهید مطمئن شوید که این در واقع کامپایل.
ساخت درخت دودویی، و آه، ما برخی از چیزهای رفتن در اینجا.
>> ما باید اعلام ضمنی عملکرد ساخت گره.
باز هم، با این کامپایلر، ما در حال رفتن به بالا شروع می.
آنچه که باید به معنای این است که من خواستار ساخت گره قبل از من در واقع آن را اعلام.
بازگشت به کد واقعا به سرعت.
پایین، و مطمئن شوید به اندازه کافی، تابع قرار دادن من است اعلام کرد
بالای ساخت گره،
اما من تلاش برای استفاده از گره های ساخت داخل از درج.
من قصد دارم به در و کپی - و سپس رب ساخت تابع گره راه تا اینجا در بالا.
به این ترتیب، امیدوارم که کار خواهد کرد. اجازه دهید این یکی دیگر بروید.
در حال حاضر از آن کامپایل. همه خوب است.
>> اما در این مرحله، ما در واقع نه به نام تابع قرار دادن ما.
ما فقط می دانیم که آن را جمع آوری، پس بروید و در قرار دادن برخی از مکالمات شوید.
اجازه دهید که در تابع اصلی ما است.
در اینجا، ما اظهار نظر، 5، 8، و 2
و سپس ما آنها را سیم نیست تا در اینجا پایین.
بیایید برخی از مکالمات برای وارد کردن،
و نیز با استفاده از همان نوع از مسائل است که ما با استفاده از
هنگامی که ما ساخته شده است این تماس printf را به مطمئن شوید که همه چیز را قرار داده به درستی.
من قصد دارم به کپی و چسباندن،
و به جای شامل ما قصد داریم برای انجام این کار قرار دادن.
و به جای آن از 6، 10، و 1، ما قصد داریم به استفاده از 5، 8، و 2.
امیدوارم این باید 5، 8، و (2) را به درخت درج کنید.
کامپایل. همه خوب است. در حال حاضر ما در واقع می خواهیم برنامه را اجرا می کنیم.
>> همه چیز غلط بازگشت.
بنابراین، 5، 8، و 2 رفتن نیست، و به نظر می رسد که حاوی آنها را پیدا کنید یا نه.
چه خبر است؟ بیایید زوم بیرون.
مشکل اول این بود که درج به نظر می رسید برای بازگشت به غلط،
و آن را می خواهم که به این دلیل ما در تماس کاذب بازگشت ما باقی مانده است، به نظر می رسد
و ما در واقع هرگز بازگردانده درست است.
ما می توانیم که راه اندازی.
مشکل دوم این است، در حال حاضر حتی اگر ما - صرفه جویی در این، ترک،
اجرا را دوباره، آن را کامپایل، سپس آن را اجرا کنید -
ما می بینیم که چیز دیگری اتفاق افتاده است.
5، 8، و 2 نفر هنوز در درخت یافت می شود.
بنابراین، چه خبر است؟
>> بیایید نگاهی به این کد.
بیایید ببینیم که اگر ما می توانیم این رقم را.
ما با پدر و مادر بودن تهی شروع می شود.
ما مجموعه ای برابر اشاره گر به اشاره گر ریشه،
و ما در حال رفتن به محل کار راه ما را از طریق درخت.
اگر گره فعلی تهی نیست، پس از آن ما می دانیم که می توانیم کمی.
ما مجموعه ای پدر و مادر ما را به عنوان اشاره گر به اشاره گر جاری برابر،
بررسی ارزش - اگر مقادیر یکسان هستند ما بازگشت غلط است.
اگر مقادیر کمتر ما را به سمت راست نقل مکان کرد؛
در غیر این صورت، ما را به سمت چپ منتقل شده است.
سپس یک گره را ساخت. من در کمی زوم.
و در اینجا ما قصد داریم به سعی کنید به سیم ارزش ها به همان.
چه خبر است؟ بیایید ببینیم که اگر احتمالا Valgrind می تواند به ما تذکر می دهد.
>> من می خواهم به استفاده از Valgrind فقط به خاطر اینکه Valgrind واقعا به سرعت اجرا می شود
و به شما می گوید در صورتی که هر گونه خطاهای حافظه وجود دارد.
هنگامی که ما اجرا Valgrind کد،
همانطور که می بینید ضربه here--Valgrind./binary_tree--and راست را وارد کنید.
شما می بینید که ما هر گونه خطا از حافظه را ندارد، بنابراین به نظر می رسد که همه چیز خوب تا کنون است.
ما برخی از نشت حافظه، که ما می دانیم، چرا که ما نمی
اتفاق می افتد هر یک از گره های ما را به رایگان.
بیایید سعی کنید در حال اجرا GDB برای دیدن آنچه که در واقع در.
خواهیم GDB / binary_tree. این بوت فقط خوب است.
اجازه دهید تنظیم یک نقطه استراحت در درج.
اجازه دهید اجرا.
به نظر می رسد مانند ما در واقع هرگز به نام درج شده است.
به نظر می رسد مشکل این بود که زمانی که من در اینجا در اصلی -
تمام از این تماس printf شامل -
من در واقع هرگز تغییر این تماس را وارد کنید.
حالا آن را امتحان کنید. بیایید کامپایل.
همه خوب به نظر می رسد وجود دارد. حالا سعی کنید با اجرای آن، ببینید چه اتفاقی می افتد.
خوب! همه چیز خیلی خوب به نظر می رسد وجود دارد.
>> آخرین چیزی که فکر می کنم در مورد، موارد لبه به این قرار دادن وجود دارد؟
و معلوم است که، خوب، یک لبه است که همیشه به فکر کردن در مورد
است، چه اتفاقی می افتد اگر درخت خود را، خالی است و این تابع را وارد کنید با شما تماس؟
آیا کار می کند؟ خوب، اجازه دهید آن را امتحان کنید.
- binary_tree C -
راه ما در حال رفتن به آزمایش این است که، ما در حال رفتن به پایین به تابع اصلی ما،
و نه از سیم کشی این گره را مثل این،
ما فقط به اظهار نظر از کل چیزی،
و به جای استفاده از سیم کشی تا گره خودمان،
ما در واقع فقط می توانید پیش بروید و حذف همه از این.
ما قصد داریم همه چیز را به یک تماس به قرار دادن.
بنابراین، اجازه دهید - به جای 5، 8، و 2، ما در حال رفتن برای وارد کردن 7، 3، و 9.
و پس از آن ما همچنین باید برای وارد کردن 6 و همچنین می خواهم.
ذخیره. ترک کنید. ساخت درخت دودویی.
این همه کامپایل.
ما فقط می تواند آن را به عنوان اجرا کنید و ببینید که چه اتفاقی می افتد،
اما آن را نیز خواهد بود واقعا مهم است تا مطمئن شوید که
ما هیچ خطاهای حافظه را نداشته باشند،
از آنجایی که این یکی از موارد لبه ما این است که ما در مورد آن می دانیم.
>> بیایید مطمئن شوید که آن را با این نسخهها کار به خوبی تحت Valgrind،
که ما آن را فقط در حال اجرا Valgrind / binary_tree انجام دهد.
به نظر می رسد که ما در واقع یک خطا از یک زمینه -
ما این تقسیم بندی گسل.
چه اتفاقی افتاده؟
Valgrind در واقع به ما می گوید که در آن است.
بزرگنمایی کمی است.
به نظر می رسد مانند آن را در تابع قرار دادن ما رخ می دهد،
جایی که ما باید به عنوان خوانده شده نامعتبر است از اندازه 4 در قرار دادن، خط 60.
بیایید برگردید و ببینید چه خبر است در اینجا.
بزرگنمایی واقعا سریع است.
من می خواهم تا مطمئن شوید که آن را به لبه از صفحه نمایش، بنابراین ما می توانیم همه چیز را ببینید.
نگه دار، که در کمی. باشه.
پایین، و مشکل این است که حق در اینجا.
چه اتفاقی می افتد اگر ما پایین و گره فعلی ما این است که در حال حاضر تهی است،
گره پدر و مادر ما تهی است، بنابراین اگر ما نگاه کردن بسیار بالا است، حق در اینجا -
اگر این حلقه در حالی که در واقع هرگز اجرا
زیرا ارزش فعلی ما تهی - ریشه ما تهی است، بنابراین فعلی تهی است -
پس از آن پدر و مادر ما را به فعلی یا به یک مقدار معتبر می شود هرگز تعیین می کنند،
بنابراین، پدر و مادر نیز تهی باشد.
ما باید به خاطر داشته باشید که برای بررسی
زمان ما را در اینجا، و ما شروع می کنیم دسترسی ارزش پدر و مادر است.
بنابراین، چه اتفاقی می افتد؟ خوب، اگر پدر و مادر است تهی -
(پدر و مادر == NULL) - سپس ما می دانیم که
باید وجود داشته باشد نه هر چیزی در درخت است.
ما باید تلاش آن را در ریشه قرار دادن.
ما می توانیم تنها با تعیین ریشه مساوی به گره جدید است.
سپس در این مرحله، ما در واقع نمی خواهم که از طریق این چیزهای دیگر.
در عوض، درست در اینجا، ما هم می تواند کار دیگری اگر دیگری،
یا ما می توانیم همه چیز را با هم ترکیب در اینجا در دیگری،
اما در اینجا ما فقط دیگری استفاده کنید و آن را انجام دهید که راه.
در حال حاضر، ما در حال رفتن به آزمایش مطمئن شوید که پدر و مادر ما تهی نیست.
قبل از آن در واقع در تلاش برای دسترسی به زمینه های آن است.
این کمک خواهد کرد که تقسیم بندی گسل اجتناب از تماس با ما.
بنابراین، ما ترک، کوچک نمایی، تدوین، اجرا شود.
>> بدون خطا، اما ما هنوز یک دسته از نشت حافظه
از آنجا که ما به هر یک از گره های ما آزاد نیست.
اما، اگر ما به اینجا و ما در چاپ ما نگاه کنید،
ما می بینیم که، به خوبی، به نظر می رسد مثل همه از درج ما در حال بازگشت بودند درست است، که خوب است.
درج همه درست است،
و پس از آن تماس های حاوی مناسب هستند نیز صادق است.
>> کار خوب! به نظر می رسد مانند ما با موفقیت نوشته شده است را وارد کنید.
که همه ما برای این هفته مشکل تنظیم مشخصات.
یکی از چالش های سرگرم کننده را به فکر کردن در مورد این است که چگونه شما در واقع به در
و رایگان از گره ها در این درخت.
ما می تواند انجام دهد تعدادی از روش های مختلف،
اما من که تا ترک به شما برای آزمایش،
و به عنوان یک چالش سرگرم کننده امتحان کنید و مطمئن شوید که شما می توانید مطمئن شوید که
که این گزارش Valgrind می گرداند بدون خطا و بدون نشت.
>> شانس خوب در این هفته کدگذاری هافمن مجموعه مشکل،
و ما به شما در هفته آینده را ببینید!
[CS50.TV]