Podstawy programowania wykład

Podobne dokumenty
Wykład 6. Drzewa poszukiwań binarnych (BST)

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Wysokość drzewa Głębokość węzła

Wykład 2. Drzewa poszukiwań binarnych (BST)

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Drzewa wyszukiwań binarnych (BST)

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Listy, kolejki, stosy

Poprawność semantyczna

Porządek symetryczny: right(x)

Podstawy Programowania

. Podstawy Programowania 2. Drzewa bst - część pierwsza. Arkadiusz Chrobot. 22 maja 2016

Algorytmy i Struktury Danych.

ALGORYTMY I STRUKTURY DANYCH

Drzewa poszukiwań binarnych

Algorytmy i Struktury Danych

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

część 16 struktury rekurencyjne i ich zastosowania drzewa binarne, algorytmy rekurencyjne dla drzew binarnych

Algorytmy i Struktury Danych

Drzewo. Drzewo uporządkowane ma ponumerowanych (oznaczonych) następników. Drzewo uporządkowane składa się z węzłów, które zawierają następujące pola:

dr inż. Paweł Myszkowski Wykład nr 11 ( )

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA. Część 3. Drzewa Przeszukiwanie drzew

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Abstrakcyjne struktury danych w praktyce

ALGORYTMY I STRUKTURY DANYCH

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Stos LIFO Last In First Out

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Ogólne wiadomości o grafach

Co nie powinno być umieszczane w plikach nagłówkowych:

Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski

Drzewa podstawowe poj

Drzewo binarne BST. LABORKA Piotr Ciskowski

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Wykład 9 - struktury rekurencyjne uporządkowane

Rekurencyjne struktury danych

Algorytmy i struktury danych Struktury danych - drzewa IS/IO, WIMiIP

Przypomnij sobie krótki wstęp do teorii grafów przedstawiony na początku semestru.

Wstęp. #define include include include include include include

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019

Programowanie komputerów. Jacek Lach Zakład Oprogramowania Instytut Informatyki Politechnika Śląska

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

Wstęp do programowania

Podstawy programowania 1

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

Wykład 8. Drzewa AVL i 2-3-4

Podstawy Informatyki. Metody dostępu do danych

Programowanie dynamiczne, a problemy optymalizacyjne

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe i C++ dla matematyków

INFORMATYKA. Podstawy programowania w języku C. (Wykład) Copyright (C) 2005 by Sergiusz Sienkowski IME Zielona Góra

Algorytmy i Struktury Danych.

Etap 2 - Budowa interfejsu. typedef struct ELEMENT* stos; struct ELEMENT { dane Dane; stos Nastepny; }; struct kolejka { stos Poczatek, Koniec; };

Algorytmy sortowania w języku C. Autor: mgr inż. Sławomir Samolej. Zagadnienie 1. (Sortowanie)

Teoretyczne podstawy informatyki

Programowanie Proceduralne

EGZAMIN MAGISTERSKI, Biomatematyka

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Programowanie i projektowanie obiektowe

Wykłady opracowane zostały w oparciu o materiały prof. dr hab. Jerzego Weresa. Poznań 2009/2010 Algorytmy i struktury danych Krzysztof Nowakowski 2

Drzewa czerwono-czarne.

Programowanie Procedurale

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Algorytmy i struktury danych Struktury danych IS/IO, WIMiIP

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

int tab_a [ 2 ] [ 3 ];

INSTRUKCJE REPETYCYJNE PĘTLE

Lista liniowa dwukierunkowa

Struktury dynamiczne

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Podstawy Programowania C 02

Podstawy programowania C. dr. Krystyna Łapin

Łańcuchy znaków. Agnieszka Nowak - Brzezińska

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Struktury Danych i Złożoność Obliczeniowa

Uzupełnienie dot. przekazywania argumentów

Algorytmy i struktury danych. wykład 5

IX. Wskaźniki.(3 godz.)

ALGORYTMY I STRUKTURY DANYCH

Podstawy Informatyki. Wykład 6. Struktury danych

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19

tablica: dane_liczbowe

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19. Lab 9. Tablice liczbowe cd,. Operacje na tablicach o dwóch indeksach.

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Wykład 3. Drzewa czerwono-czarne

Transkrypt:

Podstawy programowania wykład Piotr Nowak 1 Instytut Badań Systemowych PAN 1 e-mail: pnowak@ibspan.waw.pl Piotr Nowak (IBS PAN) Podstawy programowania wykład 1 / 14

Program wyk adu Deklaracja drzewa binarnego De nicja drzewa BST Wstawianie i usuwanie elementów z drzewa BST Porz ¾adki zwi ¾azane z drzewem BST ( porz ¾adek inorder, preorder i post order) Minimum i maksimum w drzewie BST Drukowanie drzewa BST Wzbogacanie drzewa BST Ranga elementu PN () Podstawy programowania 05/08 2 / 37

Deklaracja drzewa binarnego Do deklaracji drzewa stosujemy struktury. /*Drzewo binarne elementów typu char*/ struct element char val; struct element *left,*right; ; Aby skrócić zapis kodów w dalszej cz ¾eci wyk adu, u zyjemy polecenia typedef: typedef struct element char val; struct element *left,*right; elem; PN () Podstawy programowania 05/08 3 / 37

De nicja drzewa BST De nicja Drzewem BST (Binary Search Tree) nazywamy drzewo binarne, spe niajace ¾ nastepujac ¾a¾ w asno sć: W ka zdym poddrzewie element w weźle ¾ jest wiekszy ¾ od wszystkich elementów z jego lewego poddrzewa i mniejszy od wszystkich elementów z jego prawego poddrzewa. PN () Podstawy programowania 05/08 4 / 37

Wstawianie elementów do drzewa BST void insert(elem **L,char x) elem *p; if((*l)==null) assert(p=(elem*)malloc(sizeof(elem))); p->left=p->right=null; p->val =x; *L=p; if((*l)->val>x) insert(&((*l)->left),x); if((*l)->val<=x) insert(&((*l)->right),x); PN () Podstawy programowania 05/08 5 / 37

Usuwanie elementów z drzewa BST void remove(elem **L) /*usuwanie korzenia*/ elem *k=*l; if(*l!=null) if((*l)->right==null) (*L)=(*L)->left; if((*l)->left==null) (*L)=(*L)->right; k=(*l)->left; while(k->right!=null) k=k->right; k->right=(*l)->right; k=*l; (*L)=(*L)->left; free(k); PN () Podstawy programowania 05/08 6 / 37

Usuwanie elementów z drzewa BST void nd_and_remove(elem**l,char x) /*usuwanie elementu x*/ elem *p=null,*k=*l; while(k!=null) if(k->val==x) break; p=k; if(k->val<x) k=k->right; k=k->left; if(k!=null&&k->val==x) if(k==*l) remove(l); if(k==p->left) remove(&(p->left)); remove(&(p->right)); if(*l!=null) printf("there is no such element!nn"); printf("the tree is empty!nn"); PN () Podstawy programowania 05/08 7 / 37

Wyszukiwanie w drzewie BST Wersja iteracyjna int searchiter(elem *l,char x) int temp=0; while(l!=null) if((l->val)==x) temp=1; l=null; if((l->val)>x) l=l->left; l=l->right; return temp; PN () Podstawy programowania 05/08 8 / 37

Wyszukiwanie w drzewie BST Wersja rekurencyjna int searchrek(elem *l,char x) if(l==null) return 0; if(l->val==x) return 1; if(l->val>x) return searchrek(l->left,x); return searchrek(l->right,x); PN () Podstawy programowania 05/08 9 / 37

Porz ¾adki zwi ¾azane z drzewem BST Porz ¾adek inorder void inorder(elem *l) inorder(l->left); printf("%c, ",l->val); inorder(l->right); PN () Podstawy programowania 05/08 10 / 37

Porz ¾adki zwi ¾azane z drzewem BST Porz ¾adek preorder void preorder(elem *l) printf("%c, ",l->val); preorder(l->left); preorder(l->right); PN () Podstawy programowania 05/08 11 / 37

Porz ¾adki zwi ¾azane z drzewem BST Porz ¾adek postorder void postorder(elem *l) postorder(l->left); postorder(l->right); printf("%c, ",l->val); PN () Podstawy programowania 05/08 12 / 37

Minimum i maksimum w drzewie BST Wyszukiwanie adresu elem* ndmin(elem *l) while(l->left!=null) l=l->left; return l; elem* ndmax(elem *l) while(l->right!=null) l=l->right; return l; PN () Podstawy programowania 05/08 13 / 37

Minimum i maksimum w drzewie BST Wyszukiwanie wartości char ndminval(elem *l) return ( ndmin(l))->val; return $ ; char ndmaxval(elem *l) return ( ndmax(l))->val; return $ ; PN () Podstawy programowania 05/08 14 / 37

Drukowanie drzewa BST void print(elem *l,int s) int i; print(l->right,s+1); for(i=0;i<s;i++) printf( ); printf("%c",l->val); printf("nn"); print(l->left,s+1); PN () Podstawy programowania 05/08 15 / 37

Deklaracja wzbogaconego drzewa BST Drzewo BST wzbogacamy o liczb ¾e dzieci. struct wezel char litera; int dzieci; struct wezel *left, *right; ; PN () Podstawy programowania 05/08 16 / 37

Ranga elementu int ranga(struct wezel *p,char zn) int pom=0, aga=0; while(p!=null) if((p->litera)==zn) if((p->left)!=null) pom=pom+((p->left)->dzieci); p=null; aga=1; if((p->litera)>zn) p=p->left; if((p->left)!=null) pom=pom+((p->left)->dzieci); pom = pom+1; p=p->right; if( aga) return pom; return -1; PN () Podstawy programowania 05/08 17 / 37

#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<time.h> #define N 12 typedef struct element char val; struct element *left,*right; elem ; void insert(elem**,char); void inorder(elem*); void preorder(elem*); void postorder(elem*); void print(elem*,int); void clean(elem**); int searchrek(elem*,char); int searchiter(elem*,char); int heigth(elem*); elem* findmin(elem*); char findminval(elem*); elem* findmax(elem*); char findmaxval(elem*); void remove(elem**); void find_and_remove(elem**,char); int main(void) elem *root=null; char t[n]='k','d','a','e','p','m','z','s','t','v','b','c'; int i=0,j,temp,l; print(root,0); for(i=0;i<n;i++) insert(&root,t[i]); printf("elements of tree: ");inorder(root); printf("\n\n"); printf("elements of tree (preorder): ");preorder(root); printf("\n\n"); printf("elements of tree (postorder): ");postorder(root); printf("\n\n"); printf("the structure of the tree:\n");print(root,0); printf("\n\n"); printf("the heigth of the tree: %d",heigth(root)); printf("\n\n"); printf("min == %c\t Max == %c",findminval(root),findmaxval(root)); printf("\n\n"); srand((unsigned)time(0)); for(i=0;i<n;i++) printf(" \n"); printf("a random element from sequence:\t"); for(j=0;j<n-i;j++)

printf("%c,",t[j]); printf("\n"); j=rand()%(n-i); temp=t[j]; printf("element %c chosen to be removed.\n",temp); t[j]=t[n-1-i]; printf("i remove %c:\n",temp); find_and_remove(&root,temp); printf("the structure of the tree:\n");print(root,0); printf("\n\n"); printf("elements of tree (inorder): ");inorder(root); printf("\n\n"); clean(&root); system("pause"); return 0; void insert(elem **L,char x) elem *p; if((*l)==null) assert(p=(elem*)malloc(sizeof(elem))); p->left=p->right=null; p->val =x; *L=p; if((*l)->val>x) insert(&((*l)->left),x); if((*l)->val<=x) insert(&((*l)->right),x); void print(elem *l,int s) int i; print(l->right,s+1); for(i=0;i<s;i++) printf(" "); printf("%c",l->val); printf("\n"); print(l->left,s+1); void inorder(elem *l)

inorder(l->left); printf("%c, ",l->val); inorder(l->right); void preorder(elem *l) printf("%c, ",l->val); preorder(l->left); preorder(l->right); void postorder(elem *l) postorder(l->left); postorder(l->right); printf("%c, ",l->val); void clean(elem **L) if(*l!=null) clean(&((*l)->left)); clean(&((*l)->right)); free(*l); *L=NULL; int searchrek(elem *l,char x) if(l==null) return 0; if(l->val==x) return 1; if(l->val>x) return searchrek(l->left,x); return searchrek(l->right,x); int searchiter(elem *l,char x) int temp=0; while(l!=null) if((l->val)==x) temp=1; l=null; if((l->val)>x) l=l->left;

l=l->right; return temp; int heigth(elem *l) int h1,h2; if(l==null) return 0; h1=heigth(l->left); h2=heigth(l->right); return h1>h2? h1+1: h2+1; elem* findmin(elem *l) while(l->left!=null) l=l->left; return l; elem* findmax(elem *l) while(l->right!=null) l=l->right; return l; char findminval(elem *l) return (findmin(l))->val; return '$'; char findmaxval(elem *l) return (findmax(l))->val; return '$'; void remove(elem **L) elem *k=*l; if(*l!=null) if((*l)->right==null)

(*L)=(*L)->left; if((*l)->left==null) (*L)=(*L)->right; k=(*l)->left; while(k->right!=null) k=k->right; k->right=(*l)->right; k=*l; (*L)=(*L)->left; free(k); void find_and_remove(elem**l,char x) elem *p=null,*k=*l; while(k!=null) if(k->val==x) break; p=k; if(k->val<x) k=k->right; k=k->left; if(k!=null&&k->val==x) if(k==*l) remove(l); if(k==p->left) remove(&(p->left)); remove(&(p->right)); if(*l!=null) printf("there is no such element!\n"); printf("empty!\n");

/*Autor: dr Piotr Sapiecha*/ #include<malloc.h> #include<stdio.h> #include<conio.h> struct wezel char litera; int dzieci; struct wezel *left, *right; ; void add(struct wezel * *, char); void inorder(struct wezel *); void dzieci(struct wezel *); void treeprint(struct wezel *,int); char searchk(struct wezel *,int); int searchrek(struct wezel *,char); int searchiter(struct wezel *,char); int ranga(struct wezel *,char); int wysokosc(struct wezel *); int liscie(struct wezel *); void clean(struct wezel**); int main(void) struct wezel *korzen=null; char zn; int x,i,temp; puts("podaj ciag liter zakonczony $:"); while((zn=getche())!='$') add(&korzen,zn); printf("\n\n"); treeprint(korzen,0); printf("\n"); inorder(korzen); x=korzen->dzieci; printf("\n"); printf("\nwysokosc = %d liczba lisci = %d\n", wysokosc(korzen), liscie(korzen)); printf("\n"); puts("podaj ciag liter zakonczony $:"); zn=getche(); while(zn!='$') temp=ranga(korzen,zn); if(temp!=-1) printf("\n\n"); treeprint(korzen,0); printf("ranga(%c)=%d\n\n",zn,temp); printf("\nbrak\n"); zn=getche();

printf("\n"); inorder(korzen); printf("\n"); dzieci(korzen); puts("\naby zakonczyc nacisnij ENTER!"); getch(); clean(&korzen); return 0; void add(struct wezel * * p, char w) if((*p)==null) (*p) = new struct wezel; (*p) -> litera = w; (*p) -> left = (*p) -> right = NULL; (*p) -> dzieci = 1; ((*p)->dzieci)++; if((*p)->litera > w) add(&((*p)->left),w); add(&((*p)->right),w); void dzieci(struct wezel *p) if(p!=null) dzieci(p->left); printf("%d,",p->dzieci); dzieci(p->right); free(p); void inorder(struct wezel *p) if(p!=null) inorder(p->left); printf("%c,",p->litera); inorder(p->right); char searchk(struct wezel *p,int k) struct wezel *l,*r; char pom; int temp;

if(p!=null) l=p->left; r=p->right; if(l==null && r==null) pom=p->litera; temp=(l->dzieci)+1; if(k==temp) pom=p->litera; if(k< temp) pom=searchk(l,k); if(r!=null && k>temp) pom=searchk(r,k-temp); if(k==1) pom=p->litera; if(r!=null) pom=searchk(r,k-1); return(pom); void treeprint(struct wezel *p,int k) if(p!=null) treeprint(p->right,k+1); for(int i=0;i<k;i++) printf(" "); printf("%c\n",p->litera); treeprint(p->left,k+1); int searchrek(struct wezel *p,char zn) int pom; if(p==null) pom=0; if((p->litera)==zn) pom=1; if((p->litera)>zn) pom=searchrek(p->left,zn); pom=searchrek(p->right,zn); return pom; int searchiter(struct wezel *p,char zn) int pom=0; while(p!=null) if((p->litera)==zn) pom=1; p=null; if((p->litera)>zn) p=p->left; p=p->right;

return pom; int ranga(struct wezel *p,char zn) int pom=0; int flaga=0; while(p!=null) if((p->litera)==zn) if((p->left)!=null) pom=pom+((p->left)->dzieci); p=null; flaga=1; if((p->litera)>zn) p=p->left; if((p->left)!=null) pom=pom+((p->left)->dzieci); pom = pom+1; p=p->right; if(flaga) return pom; return -1; int wysokosc(struct wezel *p) int a,b; if(p==null) return 0; a=wysokosc(p->left); b=wysokosc(p->right); if(a < b) return b + 1; return a + 1; int liscie(struct wezel *p) if(p==null) return 0; if(p->left == p->right) return 1; return liscie(p->left) + liscie(p->right); void clean(struct wezel **L) if(*l!=null) clean(&((*l)->left)); clean(&((*l)->right)); free(*l); *L=NULL;