<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hr">
	<id>https://croatianschoolsydney.com/index.php?action=history&amp;feed=atom&amp;title=AVL_stablo</id>
	<title>AVL stablo - Povijest promjena</title>
	<link rel="self" type="application/atom+xml" href="https://croatianschoolsydney.com/index.php?action=history&amp;feed=atom&amp;title=AVL_stablo"/>
	<link rel="alternate" type="text/html" href="https://croatianschoolsydney.com/index.php?title=AVL_stablo&amp;action=history"/>
	<updated>2026-05-24T14:07:55Z</updated>
	<subtitle>Povijest promjena ove stranice na wikiju</subtitle>
	<generator>MediaWiki 1.36.2</generator>
	<entry>
		<id>https://croatianschoolsydney.com/index.php?title=AVL_stablo&amp;diff=410177&amp;oldid=prev</id>
		<title>WikiSysop: Bot: Automatska zamjena teksta  (-&lt;!--(.*?)--&gt; +)</title>
		<link rel="alternate" type="text/html" href="https://croatianschoolsydney.com/index.php?title=AVL_stablo&amp;diff=410177&amp;oldid=prev"/>
		<updated>2022-01-03T02:02:31Z</updated>

		<summary type="html">&lt;p&gt;Bot: Automatska zamjena teksta  (-&amp;lt;!--(.*?)--&amp;gt; +)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;hr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←Starija inačica&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Inačica od 02:02, 3. siječnja 2022.&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Redak 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Redak 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;!--'''AVL stablo'''--&amp;gt;&lt;/del&gt;''AVL-stablo'' je struktura [[podatak]]a koja se koristi u [[računarstvo|računarstvu]]. Radi se o [[Balansiranje|balansiranom]] [[binarno stablo|binarnom stablu]] pretrage, koje jamči da se operacije umetanja, traženja i brisanja elemenata iz stabla i u najgorem slučaju mogu sprovesti u broju koraka koji odgovara logaritmu broja elemenata u stablu, [[O notacija|O]](log n). Motiv za korištenje binarnih stabala upravo je brza pretraga stabla, ali kod uobičajenog, nebalansiranog binarnog stabla može doći do debalansa (neka grana stabla se značajnije izduži), i onda pretraga koja ide kroz tu granu nema logaritamsku, već linearnu složenost.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;''AVL-stablo'' je struktura [[podatak]]a koja se koristi u [[računarstvo|računarstvu]]. Radi se o [[Balansiranje|balansiranom]] [[binarno stablo|binarnom stablu]] pretrage, koje jamči da se operacije umetanja, traženja i brisanja elemenata iz stabla i u najgorem slučaju mogu sprovesti u broju koraka koji odgovara logaritmu broja elemenata u stablu, [[O notacija|O]](log n). Motiv za korištenje binarnih stabala upravo je brza pretraga stabla, ali kod uobičajenog, nebalansiranog binarnog stabla može doći do debalansa (neka grana stabla se značajnije izduži), i onda pretraga koja ide kroz tu granu nema logaritamsku, već linearnu složenost.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;AVL-stablo je dobilo ime po izumiteljima ([[G.M. Adelson-Velskii]] i [[E.M. Landis]]) koji su opisali ovu strukturu [[1962.]] u radu Algoritam za organiziranje podataka (''An algorithm for the organization of information'').&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;AVL-stablo je dobilo ime po izumiteljima ([[G.M. Adelson-Velskii]] i [[E.M. Landis]]) koji su opisali ovu strukturu [[1962.]] u radu Algoritam za organiziranje podataka (''An algorithm for the organization of information'').&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>https://croatianschoolsydney.com/index.php?title=AVL_stablo&amp;diff=113484&amp;oldid=prev</id>
		<title>WikiSysop: Bot: Automatski unos stranica</title>
		<link rel="alternate" type="text/html" href="https://croatianschoolsydney.com/index.php?title=AVL_stablo&amp;diff=113484&amp;oldid=prev"/>
		<updated>2021-09-07T23:20:50Z</updated>

		<summary type="html">&lt;p&gt;Bot: Automatski unos stranica&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nova stranica&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;!--'''AVL stablo'''--&amp;gt;''AVL-stablo'' je struktura [[podatak]]a koja se koristi u [[računarstvo|računarstvu]]. Radi se o [[Balansiranje|balansiranom]] [[binarno stablo|binarnom stablu]] pretrage, koje jamči da se operacije umetanja, traženja i brisanja elemenata iz stabla i u najgorem slučaju mogu sprovesti u broju koraka koji odgovara logaritmu broja elemenata u stablu, [[O notacija|O]](log n). Motiv za korištenje binarnih stabala upravo je brza pretraga stabla, ali kod uobičajenog, nebalansiranog binarnog stabla može doći do debalansa (neka grana stabla se značajnije izduži), i onda pretraga koja ide kroz tu granu nema logaritamsku, već linearnu složenost.&lt;br /&gt;
&lt;br /&gt;
AVL-stablo je dobilo ime po izumiteljima ([[G.M. Adelson-Velskii]] i [[E.M. Landis]]) koji su opisali ovu strukturu [[1962.]] u radu Algoritam za organiziranje podataka (''An algorithm for the organization of information'').&lt;br /&gt;
&lt;br /&gt;
Definicija AVL-stabla glasi:&lt;br /&gt;
&lt;br /&gt;
''AVL-stablo je binarno stablo pretrage kod kojeg apsolutna razlika visina lijevog i desnog podstabla svakog elementa nije veća od jedan.''&lt;br /&gt;
&lt;br /&gt;
== Balansiranje i rotacije ==&lt;br /&gt;
[[Datoteka:Tree Rebalancing.gif|mini|640x640px|Slika 1. Primjer rotacija]]&lt;br /&gt;
Balansiranost AVL stabla provodi se pomoću tzv. faktora balansiranja. Faktor balansiranja je '''razlika visine lijevog i desnog podstabla lista'''. Prema definiciji AVL stabla, faktor balansiranja svakog lista mora biti između -1 i 1 da bi stablo bilo u balansu. U slučaju da prilikom brisanja ili unosa listova uočimo da je on 2 ili -2 (ne može biti niži ili viši ako se ispravno balansira), moramo provesti rotaciju. Ako je faktor jednak 2, podstablo naginje na lijevo, inače naginje na desno.&lt;br /&gt;
&lt;br /&gt;
Postoje četiri vrste debalansova: &lt;br /&gt;
&lt;br /&gt;
* LL debalans &lt;br /&gt;
* RR debalans &lt;br /&gt;
* LR debalans &lt;br /&gt;
&lt;br /&gt;
* RL debalans &lt;br /&gt;
&lt;br /&gt;
Slova L (left) i R (right) označavaju u koju stranu je umetnut list stabla. Na primjer, ako je list X u LR debalansu, to znači da je novi list umetnut u desno podstablo X-ovog lijevog djeteta. &lt;br /&gt;
&lt;br /&gt;
Za implementaciju rotacije potrebna su tri (četiri) lista: &lt;br /&gt;
&lt;br /&gt;
# X (kritični list u kojemu je faktor balansiranja &amp;lt;code&amp;gt;&amp;gt;1&amp;lt;/code&amp;gt; ili &amp;lt;code&amp;gt;&amp;lt;-1&amp;lt;/code&amp;gt;), &lt;br /&gt;
# X-ovo lijevo ('''L'''L, '''L'''R debalans) ili desno dijete ('''R'''R, '''R'''L debalans) &lt;br /&gt;
# Lijevo (L'''L''', R'''L''' debalans) ili desno (R'''R''', L'''R''' debalans) dijete prethodnog lista &lt;br /&gt;
# Roditelj kritičnog lista (prilikom rotacije X više nije na vrhu - stoga kao dijete roditelja moramo postaviti odgovarajuće dijete kritičnog lista)  &lt;br /&gt;
&lt;br /&gt;
Svaki debalans se rješava posebnom rotacijom: LL debalans rješava se desnom rotacijom oko kritičnog lista, RR debalans lijevom, LR dvostrukom lijevo-desnom rotacijom prvo oko srednjeg lista, a zatim kritičnog lista relevantne trojke te RL dvostrukom desno-lijevom rotacijom prateći logiku prethodne LR rotacije. Desno-lijeve i Lijevo-desne rotacije mogu se obaviti jednostavnijim postupkom vidljivim u trećem programskom isječku.&lt;br /&gt;
&lt;br /&gt;
Napomena: ukoliko spremimo i ispravno podesimo djecu relevantnih listova, nije bitno da li se balans dogodio na vrhu ili drugdje u stablu zbog toga što će se ispravnim postavljanjem djece njihova podstabla ispravno postaviti u odnosu na ostale listove stabla. Na primjer, u slučaju da se list unese 10 razina ispod nekog lista X koji je postao kritičan, relevantna trojka su i dalje X, njegovo dijete i dijete njegovog djeteta, zbog toga što je X kritični list. &lt;br /&gt;
&lt;br /&gt;
== Implementacija u kodu ([[C++]]) ==&lt;br /&gt;
Preduvjeti:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
class AVL_Stablo    // minimalističko stablo&lt;br /&gt;
{&lt;br /&gt;
private:&lt;br /&gt;
    struct Node&lt;br /&gt;
    {&lt;br /&gt;
    	Node* lijevo;&lt;br /&gt;
    	Node* desno;&lt;br /&gt;
    &lt;br /&gt;
    	long visinaLijevo;  // broj razina lijevog podstabla + 1&lt;br /&gt;
    	long visinaDesno;&lt;br /&gt;
    &lt;br /&gt;
    	inline long visina()&lt;br /&gt;
    	{&lt;br /&gt;
    		if (visinaLijevo &amp;gt; visinaDesno)&lt;br /&gt;
    			return visinaLijevo;&lt;br /&gt;
    		return visinaDesno;&lt;br /&gt;
    	}&lt;br /&gt;
    	inline int faktorBalansiranja()&lt;br /&gt;
    	{&lt;br /&gt;
    	    return visinaLijevo - visinaDesno;&lt;br /&gt;
    	}&lt;br /&gt;
    };&lt;br /&gt;
    Node* vrh;&lt;br /&gt;
    &lt;br /&gt;
    bool desnaRotacija(Node* A, Node* B, Node* C, Node* roditelj);&lt;br /&gt;
    bool lijevoDesnaRotacija(Node* A, Node* B, Node* C, Node* roditelj);&lt;br /&gt;
    // dodati lijevu i desno-lijevu rotaciju pomoću drugog i trećeg programskog koda&lt;br /&gt;
public:&lt;br /&gt;
    // ostatak klase&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Desna rotacija pozvana prilikom LL debalansa, &amp;lt;code&amp;gt;faktorBalansiranja = 2&amp;lt;/code&amp;gt; (prema istoj logici je izvedena i lijeva rotacija uzrokovana RR debalansom):&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
bool AVL_Stablo::desnaRotacija(Node* A, Node* B, Node* C, Node* roditelj)&lt;br /&gt;
{&lt;br /&gt;
    /*roditelj          roditelj&lt;br /&gt;
      A                B&lt;br /&gt;
     B      postaje  C   A&lt;br /&gt;
    C x                 x&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;x&amp;quot; je relevantno dijete koje mijenja roditelja (iz B-&amp;gt;desno u A-&amp;gt;lijevo)&lt;br /&gt;
    netaknuto:&lt;br /&gt;
    A-&amp;gt;desno&lt;br /&gt;
    C-&amp;gt;lijevo&lt;br /&gt;
    C-&amp;gt;desno&lt;br /&gt;
    &lt;br /&gt;
    promjene:&lt;br /&gt;
    B-&amp;gt;desno postaje A&lt;br /&gt;
    A-&amp;gt;lijevo postaje izvorni B-&amp;gt;desno&lt;br /&gt;
    roditeljevo lijevo ili desno dijete postaje B (provjerom utvrditi je li A bio roditelj-&amp;gt;lijevo ili roditelj-&amp;gt;desno)&lt;br /&gt;
    */&lt;br /&gt;
	if (!A || !B || !C)		// svi moraju biti != nullptr&lt;br /&gt;
	{&lt;br /&gt;
		return false;   // neuspješna rotacija&lt;br /&gt;
	}&lt;br /&gt;
	Node* Bd = B-&amp;gt;desno;&lt;br /&gt;
	B-&amp;gt;desno = A;&lt;br /&gt;
	A-&amp;gt;lijevo = Bd;&lt;br /&gt;
&lt;br /&gt;
    // Ako Bd != nullptr, pozovi visinu. Inače, vrati 0&lt;br /&gt;
	A-&amp;gt;visinaLijevo = (Bd ? Bd-&amp;gt;visina() : 0) + 1;&lt;br /&gt;
	B-&amp;gt;visinaDesno = A-&amp;gt;visina() + 1;&lt;br /&gt;
&lt;br /&gt;
	if (roditelj != nullptr)    // roditelj == nullptr samo kada je A ishodišni list (this-&amp;gt;vrh)&lt;br /&gt;
	{&lt;br /&gt;
		if (A == roditelj-&amp;gt;lijevo)&lt;br /&gt;
		{&lt;br /&gt;
			roditelj-&amp;gt;lijevo = B;&lt;br /&gt;
		}&lt;br /&gt;
		else if (A == roditelj-&amp;gt;desno)&lt;br /&gt;
		{&lt;br /&gt;
			roditelj-&amp;gt;desno = B;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if (this-&amp;gt;vrh == A)    // ishodišni list je bio u debalansu&lt;br /&gt;
	{&lt;br /&gt;
		this-&amp;gt;vrh = B;          // postavi B kao novi ishodišni list&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Unatoč tome što se LR i RL debalansi rješavaju tzv. &amp;quot;dvostrukim&amp;quot; rotacijama, umjesto dvostrukog rotiranja možemo odmah napraviti zamjene koje će rezultirati jednakim, ali kompaktnijim rješenjem vidljivim u sljedećem programskom kodu.&lt;br /&gt;
&lt;br /&gt;
Primjer dvostruke lijevo-desne rotacije nastale prilikom LR debalansa, &amp;lt;code&amp;gt;faktorBalansiranja = 2&amp;lt;/code&amp;gt; (rotacija RL debalansa prati istu logiku):&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
bool AVL_Stablo::lijevoDesnaRotacija(Node* A, Node* B, Node* C, Node* roditelj)&lt;br /&gt;
{&lt;br /&gt;
	/* roditelj             roditelj&lt;br /&gt;
	    A				    C&lt;br /&gt;
	  B			postaje   B   A&lt;br /&gt;
	   C                   x x&lt;br /&gt;
	  x x&lt;br /&gt;
	  &lt;br /&gt;
	&amp;quot;x&amp;quot; označava relevantnu djecu (podstabla)&lt;br /&gt;
    netaknuta djeca:&lt;br /&gt;
    B-&amp;gt;lijevo&lt;br /&gt;
    A-&amp;gt;desno&lt;br /&gt;
    &lt;br /&gt;
    promjene:&lt;br /&gt;
    C-&amp;gt;lijevo postaje B&lt;br /&gt;
    C-&amp;gt;desno postaje A&lt;br /&gt;
    B-&amp;gt;desno postaje C-&amp;gt;lijevo&lt;br /&gt;
    A-&amp;gt;lijevo postaje C-&amp;gt;desno&lt;br /&gt;
    roditelj-&amp;gt;lijevo ILI roditelj-&amp;gt;desno postaje C (ne znamo je li A bio lijevo ili desno dijete)&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	if (!A || !B || !C)		// niti jedan list ne bi trebao biti nullptr&lt;br /&gt;
	{&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Node* Cl = C-&amp;gt;lijevo;       // moramo spremiti za referencu&lt;br /&gt;
	Node* Cd = C-&amp;gt;desno;&lt;br /&gt;
	C-&amp;gt;lijevo = B;&lt;br /&gt;
	C-&amp;gt;desno = A;&lt;br /&gt;
	B-&amp;gt;desno = Cl;&lt;br /&gt;
	A-&amp;gt;lijevo = Cd;&lt;br /&gt;
&lt;br /&gt;
	B-&amp;gt;visinaDesno = (Cl ? Cl-&amp;gt;visina() : 0) + 1;&lt;br /&gt;
	// Za Cl i Cd nismo sigurni jesu li nullptr&lt;br /&gt;
	// Stoga: ako nisu - pozovi njihovu visinu, inače - vrati 0&lt;br /&gt;
	A-&amp;gt;visinaLijevo = (Cd ? Cd-&amp;gt;visina() : 0) + 1;&lt;br /&gt;
	C-&amp;gt;visinaLijevo = B-&amp;gt;visina() + 1;&lt;br /&gt;
	C-&amp;gt;visinaDesno = A-&amp;gt;visina() + 1;&lt;br /&gt;
&lt;br /&gt;
	if (roditelj)   // ako nije parent nullptr, najviši list nije == this-&amp;gt;vrh&lt;br /&gt;
	{&lt;br /&gt;
		if (A == roditelj-&amp;gt;lijevo)  // ako je najviši list lijevo dijete njegovog roditelja&lt;br /&gt;
		{&lt;br /&gt;
			roditelj-&amp;gt;lijevo = C;&lt;br /&gt;
		}&lt;br /&gt;
		else if (A == roditelj-&amp;gt;desno)  // ako je najviši list desno dijete njegovog roditelja&lt;br /&gt;
		{&lt;br /&gt;
			roditelj-&amp;gt;desno = C;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else    // najviši list nema roditelja, što znači da je izvorno debalansirani list bio&lt;br /&gt;
	{       // this-&amp;gt;vrh te zbog toga sada moramo postaviti novi vršni list&lt;br /&gt;
		this-&amp;gt;top = C;&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Kategorija:Baze podataka]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
</feed>