Programovanie v jazyku C stromy



Podobné dokumenty
Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Programování v C++ 1, 16. cvičení

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Algoritmy a datové struktury

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

5 Rekurze a zásobník. Rekurzivní volání metody

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Stromy. Jan Hnilica Počítačové modelování 14

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

Základní datové struktury III: Stromy, haldy

Dynamické datové struktury IV.

Rekurzivní algoritmy

BINARY SEARCH TREE

BINARY SEARCH TREE

Základní stavební prvky algoritmu

Stromy, haldy, prioritní fronty

Dynamické datové struktury II.

Dynamické datové struktury III.

awk programovatelný filtr

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

Programovanie v jazyku C - pole treba poorat...

Základní datové struktury

Jan Březina. Technical University of Liberec. 17. března 2015

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

a) b) c) Radek Mařík

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

R zné algoritmy mají r znou složitost

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Programování v C++ 1, 1. cvičení

Datové struktury Úvod

Dynamické programování. Optimální binární vyhledávací strom

Radek Mařík

Rozptylování, stromy - zákl. vlastnosti

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Úvod Petr Kropík viz:

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT. Cyklus while, do-while, dělitelnost, Euklidův algoritmus

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

Programovanie v jazyku C - to chce dynamiku

Reprezentace dat v informačních systémech. Jaroslav Šmarda

Algoritmizace a programování

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace

Vstupní a vstupní proudy v C++

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Stromy. Jan Kybic.

Martin Flusser. December 15, 2016

Binární vyhledávací stromy pokročilé partie

Uložené procedury Úvod ulehčit správu zabezpečení rychleji

Algoritmizace a programování

Prioritní fronta, halda

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Implementace binárního stromu směrníky

Operační systémy. Cvičení 4: Programování v C pod Unixem

Datové struktury obsah přednášky 1. Úvod 2. Třídy Type-wrapper (obalový typ) pro primitivní typy automatické převody 3. Automatické převody mezi

Programování 1. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

TGH07 - Chytré stromové datové struktury

Teória grafov. Stromy a kostry 1. časť

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Spojová implementace lineárních datových struktur

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

a) Θ(1) b) závislou na hloubce uzlu u c) mezi O(1) a Ω (log n) Jméno:... St. Sk.:. Cvičící:.. Bodů ze cv.: a) Ο(n) b) Θ(n) d) Ο(n 2 )

TGH07 - Chytré stromové datové struktury

pak celou úlohu. ani Jako obvykle je static int M, N; [] key, L, R; NIL = -1; cost; roota, rootb; throws IOExceptio // tree roots on { static void

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

MS Word 2007 REVIZE DOKUMENTU A KOMENTÁŘE

Zápis programu v jazyce C#

Lineární spojový seznam (úvod do dynamických datových struktur)

autoři: Rudolf Bayer, Ed McCreight všechny vnější uzly (listy) mají stejnou hloubku ADS (abstraktní datové struktury)

Část 2 Příklad načítání grafu, kompilace a projekt s více soubory. Část 3 Zadání 9. domácího úkolu (HW09)

Algoritmizace I. Ak. rok 2015/2016 vbp 1. ze 132

Programovanie v jazyku C - funkcie a makra

Ovládání LCD. Ing. Josef Grosman. TECHNICKÁ UNIVERZITA V LIBERCI Fakulta mechatroniky, informatiky a mezioborových studií

POKYNY VLASTNOSTI LÁTEK

Stromy. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 B0B36PRP Procedurální programování

Algoritmizace a programování

Abstraktní datové typy

Programovanie v jazyku C - struktury a polia

Algoritmizace a programování

Ovoce do škol Příručka pro žadatele

Red Black strom (Red Black Tree) Úvod do programování. Rotace. Red Black strom. Rotace. Rotace

Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY

Datové struktury obsah přednášky 1. Úvod 2. Třídy Type-wrapper (obalový typ) pro primitivní typy automatické převody 3. Automatické převody mezi

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Modul řízení otáček stejnosměrného motorku

Datové typy pro reálná čísla

Transkript:

CVIČENIE 10/13 (S7) Programovanie v jazyku C stromy Binarne stromy: - zlozene z nula alebo viac prvkov - kazdy prvok obsahuje o nejaku hodnotu (data) o smernik na laveho potomka o smernik na praveho potomka - moze byt empty - ak nie je empty ma root node o kazdy prvok binarneho stromu je dosazitelny z korenoveho prvku po unikatnej ceste - prvok bez potomkov je nazyvany list (leaf) o existuju binarne stromy kde len listy obsahuju data a b c d e f g h i j k l - velkost binarneho stromu je pocet prvkov v nom (12) - hlbka prvku je vzdialenost od korena (e 2) - hlbka stromu je maximalna vzdialenost od korena (4) - vyvazeny binarny strom vsetky prvky okrem tych v najspodnejsie vrstve maju dvoch potomkov

7 Prehladavanie v zatriedenom poli: Zacni: (lo + hi)/2 Hladame 5: 3 13 2 5 11 17 (0+6)/2 = 3 hi = 2; (0 + 2)/2 = 1 lo = 2; (1+3)/2=2 0 1 2 3 4 5 6 2 3 5 7 1 1 1

Prechadzanie stromu: - kazdy binarny strom je definovany rekurzivne, pomocou korenoveho nodu a laveho podstromu a praveho podstromu - prechadzanie takeho to stromu tak aby sme kazdy prvok navstivili prave raz je teda rekurzivne Preorder : root, left, right Inorder : left, root, right Postorder: left, right, root Binarne stromy su vhodne napriklad na vyjadrenie vyrazov: + + 2 2 2+2 + * 4 2 * 3 4 2+3*4 2 3 (2+3)*4

BINÁRNÍ STROMY - vyhledávací stromy prvek 1. Navrhnout datové struktury 2. Operace INSERT, SHOW, DELETE Tato podmínka platí pro každý prvek!! menší prvek < větší prvek udělat INSERT bez podmínky if (vyjma při testování, zda se naalokovala paměť) hint: každá podmínka vrací 0 nebo 1 tedy int Pozn. - pro tisk stromu se hodí tisk několika mezer printf( %5c, a )... vytiskne se znak a na šířku 5 printf( %*c,k, a )... vytiskne se znak a na šířku k pokud je šířka udána * určuje počet znaků argument typu int, který musí v seznamu argumentů bezprostředně předcházet argumentu, který se má tisknout INSERT - najdu místo ve stromě, kam uzel patří a tak vložím nový list DELETE - list... smažu - uzel s 1 synem... přepojím a smažu - uzel se 2 syny... najdu nejpravější v levém podstromu (nebo nejlevější v pravém podstromu) a ten uzel prohodím s mazaným uzlem 10 5 20 2 7 15 30 1 3 9

Prolézání stromu 1. pomocí if if (x<p->x) p = p->l; else p = p->r; 2. bez if enum {left, right; struct prvek { int x; prvek* dalsi[2]; p = p->dalsi[x > p->x]; Př. naprogramujte binární vyhledávací strom použít pointer na pointer - insert - tisk stromu - (delete) #include <malloc.h> #include <stdio.h> struct prvek { int val; prvek* kam[2]; // v kam[0] bude ukazatel doleva, v kam[1] bude ukazatel doprava ; struct strom { prvek* koren; ; // pridani prvku do stromu int add_strom(strom* st, int x){ printf("add %d \n",x); prvek* n; n = (prvek*)malloc(sizeof(prvek)); if (!n) { printf("neni pamet"); return -1; n->val = x; n->kam[0] = NULL; n->kam[1] = NULL; prvek** p; p = &(st->koren);

while (*p) p = &((*p)->kam[x>(*p)->val]); *p = n; // smazani prvku ve stromu int del_strom(strom* st, int x){ printf("del %d\n",x); prvek** p; prvek* tm; prvek** tmp; p = &(st->koren); // prazdny strom if (!(*p)) { printf("prazdny strom - nelze mazat"); return -1; // hledam uzel, ktery se ma smazat while ( (*p) && ((*p)->val!=x) ) { p = &((*p)->kam[x>(*p)->val]); // uzel ve stromu neni if (!(*p)) { printf("prvek ve strome neni - nelze mazat \n"); return 1; // uzel ve stromu JE // - uzel p ma 2 syny if( (*p)->kam[0] && (*p)->kam[1] ){ // najdu nejmensi (nejlevejsi) prvek "tmp" v pravem podstrome tmp = &((*p)->kam[1]); while ( (*tmp) && ((*tmp)->kam[0]) ) tmp = &((*tmp)->kam[0]); // zkopiruju hodnotu do uzlu, ktery chci mazat (*p)->val = (*tmp)->val; //smazu nejlevejsi uzel v prazem podstromu (*tmp)

// - uzel (*tmp) nema leveho syna tm = *tmp; (*tmp) = (*tmp)->kam[1]; // prepojime praveho syna free(tm); else { // jeden ze synu uzlu p chybi tm = *p; // kdyz neni levy syn, prepojime o patro vys praveho syna *p = (!((*p)->kam[0]))? (*p)->kam[1] : (*p)->kam[0]; free(tm); // tisk jednoho prvku int print_prvek(prvek* p){ if (p) { if ((p->kam[0]) &&(p->kam[1])) printf("uzel %d s L:%d a P:%d\n",p->val,p->kam[0]->val,p->kam[1]->val); if ((!p->kam[0]) &&(p->kam[1])) printf("uzel %d s P:%d\n",p->val,p->kam[1]->val); if ((p->kam[0]) &&(!p->kam[1])) printf("uzel %d s L:%d\n",p->val,p->kam[0]->val); if ((!p->kam[0]) &&(!p->kam[1])) printf("uzel %d \n",p->val); print_prvek(p->kam[0]); print_prvek(p->kam[1]); // tisk celeho stromu int print_strom(strom* st){ if (!(st->koren)) { printf("prazdny strom \n"); return 1; print_prvek(st->koren); printf("\n\n");

// inicializace stromu strom* init_strom(){ strom* st = (strom*) malloc(sizeof(strom)); st->koren=null; return st; // main int main (int argc, char** argv){ strom* tr; tr = init_strom(); add_strom(tr,3); add_strom(tr,5); del_strom(tr,5); del_strom(tr,10); BINÁRNÍ VYVÁŽENÝ VYHLEDÁVACÍ STROM - binární vyhledávací strom - pro každý uzel platí navíc podmínka, že výška v pravém a levém podstromu se liší nejvýše o 1 3. DOMÁCÍ ÚKOL Př. program, který načte jako parametry příkazy pro práci s binárním stromem ix... vloží prvek s hodnotou x do binárního stromu dx... vybere prvek s hodnotou x z binárního stromu např. myprog i4 d4 i8 i9 d7 Možná struktura main: int main (int argc, char** argv){ char* param;...

argv++; // posuneme se na prvni skutečný parametr; // dokud mame nejaky parametr while (*argv){ switch (**argv){ // switch podle prvního znaku v parametru case 'i':... break; case 'd':... break; argv++; Řešení main: int main (int argc, char** argv){ strom* tr; tr = init_strom(); argv++; // posuneme se na prvni parametr; // dokud mame nejaky parametr while (*argv){ switch (**argv){ case 'i': add_strom(tr,atoi(*argv+1)); break; case 'd': del_strom(tr,atoi(*argv+1)); break; argv++;