Articles

Code Challenge: Understanding Binary Tree Algorithms in Swift

Challenge: Given a *non-empty* binary tree, find the maximum path sum. Tätä ongelmaa varten poluksi määritellään mikä tahansa solmukohta jostakin aloitussolmusta mihin tahansa puun solmukohtaan vanhemman ja lapsen välisiä yhteyksiä pitkin. Polussa on oltava vähintään yksi solmu, eikä sen tarvitse kulkea juuren läpi:

Example #1:
Input:
4
/ \
5 6
Output: 15

Esimerkki #2:


Input:
-10
/ \
9 20
/ \
15 7
Output: 42

haaste

kuten nimikin osoittaa, binääripuu on suosittu puurakenteen tyyppi. Aika-ja tilatehokkuutensa tueksi puut edustavat usein avainta ja kahta tai useampaa lehtisolmua, jotka muistuttavat seuraavia rakenteita:

Binary Search Tree

Trie Data Structure

As one may guess, recursion is also a common property of tree-based structures. Vaikka useimpia rekursiivisia funktioita paheksutaan reaalisovelluksissa, puut mahdollistavat tietyt tehokkuudet, sillä jokainen lehtisolmu voi edustaa myös toista puuta:

binääripuu: korostettu elementti toimii sekä lapsilehtisolmuna että juurisolmuna.

Jos puita ei ymmärretä oikein, ne voivat aiheuttaa sekavuutta ja lisätä monimutkaisuutta. Jotta voimme ratkaista koodihaasteemme, meidän täytyy keksiä johdonmukainen menetelmä puun navigointiin ja tapa vertailla kaikkia mahdollisia permutaatioita.

työskennellään visualisoimalla ideoitamme ennen kuin sitoudumme koodaamaan niitä. Aluksi käsittelemme ensin puun navigointia. Koska puupohjaisiin rakenteisiin sisältyy lisäominaisuus * syvyys*, yksinkertaisia tekniikoita, kuten nopealukemista, ei yleensä käytetä. Sen sijaan voimme käyttää erityisiä läpikulkualgoritmeja, kuten syvyys-tai leveys – ensimmäinen haku (esim.DFS ja BFS vastaavasti). Vaikka BFS: n aihe on riittävän yksityiskohtainen uutta keskustelua varten, voimme päätellä, että tämä olisi normaali tapa kulkea tällaisen rakenteen läpi. Koska työskentelemme Binääripuun kanssa, voimme soveltaa erityisiä algoritmisia tehokkuusetuja, jotka auttavat oikomaan läpikulkuprosessia.

mikä siis on Binääripuu? Pohjimmiltaan se on standardi Array, joka on visualisoitu puu. Tässä tapauksessa korostetaan visualisointi näkökohtia, koska tämä vaikuttaa siihen, miten me navigoida rakenne. Esimerkiksi jokaiselle solmulle sen vasen ja oikea lehtilapsisolmu voidaan itse asiassa laskea käyttämällä näitä yksinkertaisia kaavoja:

kuten on keskusteltu, nämä kaavat toimivat, koska puurakenteemme taustalla on joukko. Tämä eroaa muista rakenteista, kuten B-puu, Tree tai kaavio, jossa yksi soveltaisi tietyn mukautetun tietorakenteen edustaa mallia.

tekemällä vertailuja

koska Binääripuumme ei itse asiassa ole mitään muuta kuin joukko, voimme todellakin käyttää peruslaskujoukkoa iteroidaksemme kaikki arvot. Käytämme kuitenkin kaavojamme määrittääksemme lapsilehtisolmut. Kun perustettu, voimme seurata kokonaismäärät kunkin osa-puu käyttäen yksinkertainen muoto memoization (esim. dynaaminen ohjelmointi).