Albero binario

Un albero binario

In informatica un albero binario è un albero i cui nodi hanno grado compreso tra 0 e 2. Per albero si intende un grafo non diretto, connesso e aciclico mentre per grado di un nodo si intende il numero di sotto alberi del nodo, che è uguale al numero di figli del nodo.

Anche l'albero costituito da un solo nodo e nessun arco si considera un albero binario valido, sebbene il grado del nodo in questo caso sia nullo.

Come nel caso generale degli alberi è possibile individuare (in maniera non unica) un nodo radice: qualunque nodo di grado minore di 3 può essere scelto come radice dell'albero binario. Stabilito un nodo radice è possibile costruire delle relazioni di parentela tra nodi: il nodo radice non ha padre e può avere 0, 1 o 2 figli, ed ogni nodo è ovviamente padre dei suoi figli. Poiché tutti i nodi tranne la radice hanno un padre, per via della limitazione sul grado dei nodi ogni nodo può avere al massimo 2 figli (da qui il nome "albero binario").

I nodi senza figli vengono detti foglie o nodi terminali; un nodo non foglia è un nodo interno.

Implementare gli alberi binari

In questa sezione trattiamo l'implementazione degli alberi binari dal punto di vista teorico, facendo ricorso a strutture di programmazione generiche; sarà poi compito del programmatore decidere come implementare queste strutture sulla base del linguaggio di programmazione che si troverà ad usare.

Esistono vari sistemi, ma il più semplice risulta essere quello che utilizza un array che contiene i nodi dell'albero secondo questa logica: la radice occupa la prima posizione dell'array e i figli di questa radice sono a loro volta nell'array e occupano come posizione (2i) e (2i+1) dove i è la posizione della radice, del padre, dei due figli.

Si fa notare che questa implementazione è ottimale se l'albero è pieno cioè se tutti gli elementi che costituiscono l'albero hanno esattamente due figli, tranne ovviamente le foglie, altrimenti è necessario un flag booleano, in realtà un array di accompagnamento, che ci indica se la posizione è valida o meno.

Interpretiamola: in A, posizione 1, c'è sempre la radice, in posizione 2 e 3 troviamo i figli B e C. Prendiamo il figlio B, posizione 2, i suoi figli sono in 4 e 5, ma, la colonna dei flag ci dice che le posizioni 4 e 5 sono disattivate, infatti B non ha figli, al contrario, C posizione 3, in 6 e 7 ha proprio i valori cercati e cioè i suoi due figli D, E.

I vantaggi dell'utilizzo di questa implementazione sono la semplicità di accesso e la semplicità di gestione degli elementi della lista, al contrario, le operazioni di inserimento e in generale la dimensione considerevole di un array di un grande albero giocano a sfavore di questa implementazione che risulta essere di conseguenza sconveniente da usare.

Un'altra implementazione che prevede l'uso di array è quello della rappresentazione collegata con array, in cui, in una tabella a tre colonne abbiamo, rispettivamente per riga, in quella centrale il valore, in quella sinistra l'indirizzo del figlio sinistro e in quella destra l'indirizzo di quello destro. È necessario aggiungere una variabile inizio per indicare il punto in cui dobbiamo iniziare l'analisi, al contrario, se un indirizzo è a zero è da considerarsi NULL.

Inizio = 1

Iniziando da 1, A ha figli che sono in 2 e 3, il figlio B non ha discendenti, quello C invece ha come discendenti 4 a sinistra e 5 a destra, cioè D ed E.

Lo stesso risultato si può ottenere prendendo in considerazione anziché un array, un semplice nodo strutturato a tre campi, etichetta, figlio sinistro, figlio destro e con un puntatore al primo nodo, e di fatto ci ricolleghiamo all'immagine di accompagnamento alle due tabelle precedenti.

Profondità di un albero: La radice r ha profondità 0, i suoi figli sinistro e destro, hanno profondità 1, i nipoti profondità 2 e così via. Quindi se la profondità di un nodo è p i suoi figli non vuoti hanno profondità p+1

Per quanto riguarda l'altezza h di un albero binario è data dalla massima profondità raggiunta dalle sue foglie. Quindi, l'altezza misura la massima distanza di una foglia dalla radice dell'albero, in termini di numero di archi attraversati. Poiché la definizione di alberi si applica anche ai sotto alberi, è più efficiente e semplice trovare l'altezza di un albero binario osservando che l'albero composto da un solo nodo ha altezza pari a 0, mentre un albero con almeno due nodi ha altezza pari all'altezza del suo sottoalbero più alto, incrementata di uno in quanto la radice introduce un ulteriore livello

h=profondità del più lungo cammino

Nel caso dell'albero nella figura qui sopra, l'altezza h è 0(foglie)+1(figli radice)+1(radice)=2.

Esistono alcune formule per calcolare le caratteristiche degli alberi:

Altezza di un albero binario bilanciato pieno di n nodi
Numero massimo di nodi in un albero binario di altezza h
Altezza o numero minimo di nodi di un albero con altezza h
Numero massimo di nodi ad un livello l (elle)

Implementare gli alberi di ricerca binari su array

Se non è necessario effettuare frequentemente operazioni di inserimento e cancellazioni o non è affatto necessario effettuarle e non si vuole usare troppa memoria è possibile implementare un albero di ricerca binario su un array ordinato, con la restrizione che il numero degli elementi sia con .

L'immagine sopra mostra un albero di ricerca binario implementato su un array ordinato di 15 elementi, si comincia ponendo il centro dell'array come radice dell'albero e come sue foglie rispettivamente il centro della parte destra dell'array e il centro della parte sinistra dell'array, si continua applicando ricorsivamente il procedimento fino a che non sono stati coperti tutti gli elementi. Si ottiene quindi l'equivalente dell'albero

lo pseudo-algoritmo per la ricerca di una chiave è

Ricerca di una chiave
   N:= numero di elementi dell'albero (2^k-1)
   A:= array delle N chiavi ordinate in ordine crescente, A[0], A[1] .. A[N - 1]
   key:= chiave da cercare
   jump:= (N + 1)/4
   i: = (N - 1)/2
   while jump > 0 do
       if key == A[i] then
           ricerca finita
       else if key < A[i] then
           i = i - jump
       else if key > A[i] then
           i = i + jump
       endif
       jump = jump / 2
   done
   nessun risultato

Suddetta modalità di visualizzazione di un albero binario sfrutta la definizione di skip-list, ossia di albero binario i cui elementi sono ordinati e si sfrutta una algoritmo randomizzato. In una skip list per cercare un elemento non facciamo altro che creare nuove liste a partire da quella di partenza L0, dimezzando ogni volta gli elementi seguendo la regola (n/2^i)=2, cioè sappiamo che possiamo creare Li liste fino a che non arriviamo alla lista con il minor numero di elementi, ossia 2. La skip list è molto utile se vogliamo trovare un elemento in quanto nella ricerca dobbiamo partire dalla lista L(lgn) e scendere cercando sempre il primo elemento più grande del valore cercato x; è un buon algoritmo anche se è costoso in termini di spazio, ma è più difficile aggiungere o cancellare un elemento.

Implementare gli alberi binari tramite puntatori

Un modo semplice per implementare gli alberi binari di ricerca è quello di usare i puntatori. Nell'implementazione classica ogni nodo dell'albero oltre al suo valore ha un puntatore al figlio destro ed uno al figlio sinistro, in questo modo è possibile, partendo dalla radice, discendere nell'albero fino ad arrivare alle foglie. Tutti i nodi sono uguali, l'unica differenza è che nessun nodo punterà alla radice (infatti la radice non è né un figlio destro, né un figlio sinistro), e le foglie non avendo figli non punteranno a nulla (nil, NULL value).

Una semplice implementazione in C

/*************************************************************************************************************
* In questo file verranno incluse le funzioni necessarie a costruire un albero binario, 
* e gestirlo tramite
* i puntatori che ogni radice ha verso il figlio destro e il figlio sinistro.
* L'interfaccia è abbastanza semplice, una volta avviato si arriva ad un menu.
* Si consiglia per compilarlo sotto *nix di usare "gcc -o btree binarytree.c" , 
* Per avviarlo invece, come suggerisce l'ERRORE di parametri
* sarà utile seguire la forma ./btree <nomefile>, in cui nomefile può anche contenere il path completo.
* i dati presenti in nomefile devono essere degli interi separati da spazi.
**************************************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

FILE *intfile;

typedef struct T{  //Comincio a definire la struttura che mi servirà
    int value;  //Come posso notare ho il valore attuale e due puntatori: uno al figlio sinistro
    struct T *T_l, *T_r;  //E l'altro al figlio destro
}*tree, dim;

tree mergetree(int el, tree t1, tree t2){  //Mergetree unisce due alberi
    tree t0 = (tree)malloc(sizeof(dim));
    t0->T_l = t1;
    t0->T_r = t2;
    t0->value = el;
    return(t0);
}

tree createleaf(int el){
    return mergetree(el, NULL, NULL);  //Ogni foglia è formata da un valore e due puntatori nulli
}

int isvoidtree(tree t){  //Verifico che un albero sia vuoto
    return (t == NULL);  //Se non c'è nulla è ovvio che è un albero vuoto...
}

tree leftchild(tree t){  //Restituisce il figlio sinistro accedendo alla struttura tree
    return t->T_l;
}

tree rightchild(tree t){  //Restituisce il figlio destro, accedendo alla struttura tree
    return t->T_r;
}

int root(tree t){  //Restituisce la radice, sempre facendo accesso alla struttura
    return t->value;
}

tree insert(int el, tree t){  //Si inserisce un intero el, nell'albero t
    if(isvoidtree(t)){  //Se l'albero è vuoto, allora verrà creata una foglia
        return createleaf(el);
    }
    
    if (root(t)>=el){  //Altrimenti si procede da direttive, ovvero se il valore della radice è >= dell'elemento
        return mergetree(root(t), insert(el,leftchild(t)), rightchild(t));  //Andrà a sinistra
    }
    
    if (root(t)<el){  //Ae la radice è invece minore dell'elemento, verrà inserita a destra.
        return mergetree(root(t), leftchild(t), insert(el, rightchild(t)));
    }else{
        return t;
    }
}

int mintree(tree t){  //Trovo il minimo per dicotomia: sapendo che più mi muovo in basso
    if(isvoidtree(leftchild(t))){
        return root(t);  //Ed a sinistra, più ho un numero piccolo.
    }else{
        return mintree(leftchild(t));  //Ripeto la procedura ricorsivamente.
    }
}

int maxtree(tree t){
    if(isvoidtree(rightchild(t))){
        return root(t);  //Come per il minimo, solo che in questo caso
    }else{
        return maxtree(rightchild(t));  //Mi muovo in basso a destra
    }
}

void showtree(tree t){
    int i;
    
    if(isvoidtree(t)==false){
        showtree(leftchild(t));
        printf("%d ", root(t));
        showtree(rightchild(t));
    }
}

int main(int argc, char *argv[]){
    if(argc<2){  //Controllo che ci siano tutti i parametri
        printf("ERRORE: Per avviare il programma la sintassi è ./btree <file>\n");
        
        return(1);
    }
    
    if((intfile = fopen(argv[1],"r")) == NULL){  //Apro il file che mi serve
        printf("ERRORE: Non riesco ad aprire il file %s\n", argv[1]);
        
        return(2);
    }
    
    printf("*Ho aperto il file %s.\n", argv[1]);
    
    int num; //Scansiono il file di interi
    tree albero = NULL;  //Inizializzo l'albero vuoto
    
    while(fscanf(intfile,"%d", &num) != EOF){
        albero=insert(num,albero);
    }
    
    printf("*Ho costruito l'albero binario\n\n");
    printf("Cosa vuoi fare adesso?\n");
    printf("[s]tampare l'albero\n");
    printf("Cercare il [m]inimo\n");
    printf("Cercare il [M]assimo\n");
    printf("[u]scire.\n\n");
    
    char tmp;
    
    printf(">");
    
    while((tmp = getchar()) != 'u'){
        switch (tmp){
            case 's':  //Serve a mostrare l'albero
                 showtree(albero);
                 printf("\n");
            break;
            
            case 'm':  //Stampa a video il valore minimo
                 printf("Il valore minimo dell'albero binario è %d\n", mintree(albero));
            break;
            
            case 'M':  //Stampa a video il valore massimo
                 printf("Il valore massimo dell'albero binario è %d\n", maxtree(albero));
            break;
            
            default:
                printf(">");
            break;
        }
    }
    fclose(intfile);
    
    return(0);
}

Algoritmi elementari su alberi binari

Determinazione numero nodi in un albero binario

INIZIO

NumeroNodi (radice albero) 
    Se radice albero == NULL (l'albero è vuoto)
       return 0;
    return (NumeroNodi(figlio sinistro)+NumeroNodi(figlio destro))+1;
    
FINE

Determinazione dell'altezza

INIZIO

Altezza (radice albero)

    Se radice albero  ==  NULL  ( se l'albero è vuoto)
           return 0;
    valoreAltezzaSinistra = Altezza(figlio sinistro);
    valoreAltezzaDestra   = Altezza(figlio destro);
    return 1 + max(valoreAltezzaDestra, valoreAltezzaSinistra);

FINE

Determinazione della larghezza

La larghezza di un albero binario corrisponde al numero massimo di nodi giacenti al medesimo livello.

La determinazione di suddetta grandezza può essere ottenuta attraverso un'opportuna modifica della Visita in-order: si fa uso di un vettore, dimensionato al pari del numero di nodi, inizialmente con valori tutti uguali a zero; la funzione WrapperLarghezza è deputata al passaggio corretto dei parametri alla funzione ricorsiva Larghezza , che ritorna il valore massimo contenuto nel vettore, cioè la larghezza dell'albero.

INIZIO

WrapperLarghezza(radice albero)

    Inizializzazione array livelli;
    Larghezza(radice albero,array livelli,0);
    larghezza = CercaMassimoVettore(array livelli);
    return larghezza;

Larghezza (radice albero,array livelli,livellocorrente)
   Se radice albero == NULL (se l'albero è vuoto)
        return;
    
   livelli[livellocorrente] = livelli[livellocorrente]+1;

   Larghezza(figlio sinistro,array livelli,livellocorrente+1);
   Larghezza(figlio destro,array livelli,livellocorrente+1);

   return;

FINE

Voci correlate

Altri progetti

Collegamenti esterni

Controllo di autoritàGND (DE4145532-0

Read other articles:

Rawa di Florida, Amerika Serikat Rawa atau rawang (Inggris: swampcode: en is deprecated ) adalah lahan yang secara alami tergenang air akibat penyaliran yang terhambat, baik genangan itu terjadi secara berkala atau pun terus menerus selama waktu yang panjang dalam setahun. Digolongkan pula ke dalam rawa, lahan-lahan yang selalu jenuh air karena muka air tanahnya yang dangkal. Rawa berbeda dengan danau dan telaga, karena biasanya airnya lebih dangkal serta pada umumnya ditumbuhi oleh tumbuh-tu...

 

 

Kabupaten Hulu Sungai SelatanKabupatenTranskripsi bahasa daerah • Jawi Banjarكابوڤاتين هولو سوڠاي سلتنBundaran dan Monumen Ketupat di Hamalau LambangJulukan: DodolMotto: Rakat Mufakat (Bahasa Banjar)Slogan:BersemarakPetaKabupaten Hulu Sungai SelatanPetaTampilkan peta Kalimantan SelatanKabupaten Hulu Sungai SelatanKabupaten Hulu Sungai Selatan (Kalimantan)Tampilkan peta KalimantanKabupaten Hulu Sungai SelatanKabupaten Hulu Sungai Selatan (Indone...

 

 

Sekretariat Kementerian Koordinator Bidang Perekonomian Republik IndonesiaGambaran umumDasar hukumPeraturan Presiden Nomor 8 Tahun 2015Susunan organisasiSekretarisBambang Adi Winarso (Plt) [1]Kantor pusatGedung Ali Wardhana Jl. Lapangan Banteng Timur No.2-4, Jakarta Pusat 10710[2]Situs webwww.ekon.go.id Sekretariat Kementerian Koordinator Bidang Perekonomian Republik Indonesia merupakan unsur pembantu pimpinan pada Kementerian Koordinator Bidang Perekonomian Republik Indo...

Historical region of Poland Ermland redirects here. For the steamship, see SS Ermland. Varmi redirects here. For the village in Iran, see Varmi, Iran. Not to be confused with Warmian-Masurian Voivodeship. Historical region in Warmian-Masurian Voivodeship, PolandWarmiaHistorical regionFrom top, left to right: Olsztyn Old Town, Lidzbark Warmiński Castle, Cathedral Hill in Frombork, Reszel Old Town Coat of armsLocation of Warmia (shown in red) on the map of PolandCountry PolandVoivodeshipW...

 

 

أقمار بلوتومعلومات عامةصنف فرعي من قمر كوكبٍ قزم المكتشف أو المخترع كلايد تومبو الجرم السماوي الأم بلوتو نوع المدار hadeocentric orbit (en) زاوية الميلان 17٫14175 درجة زاوية نقطة الاعتدال 110٫30347 درجة تعديل - تعديل مصدري - تعديل ويكي بيانات صورة هابل للنظام البلوتوني توضح الأقمار الأربعة...

 

 

Masjid Gallipoli Auburn Masjid Gallipoli Auburn terletak di Auburn, New South Wales, Australia. Masjid ini terletak 16 kilometer barat ujung selatan Jembatan Pelabuhan Sydney. Masjid ini sering dikunjungi oleh Muslim Sunni Turki. Lihat pula Masjid Daftar masjid Pranala luar http://www.gallipolimosque.org.au Artikel ini terlalu bergantung pada referensi dari sumber primer. Mohon perbaiki artikel ini dengan menambahkan sumber sekunder atau tersier. (Pelajari cara dan kapan saatnya untuk menghap...

For the New Zealand DJ and radio presenter, see Zane Lowe. Australian radio and television presenter Zan RoweRowe in 2022BornSusanna RoweMelbourne, Victoria, AustraliaOther namesZanOccupation(s)Radio and television presenterEmployerAustralian Broadcasting Corporation Susanna Zan Rowe is an Australian radio and television presenter. As of 2022[update] she works for ABC digital radio station Double J. Early life Susanna Rowe (later nicknamed Zan)[1] grew up in Melbourne. ...

 

 

King of Assyria Shalmaneser IIIKing of AssyriaGlorious King of the LandsKing of the Four Corners of the WorldKing of All PeoplesShalmaneser III, on the Throne Dais of Shalmaneser III at the Iraq Museum.King of the Neo-Assyrian EmpireReign859–824 BCPredecessorAshurnasirpal IISuccessorShamshi-Adad VBorn893-891 BCDiedc. 824 BCFatherAshurnasirpal IIMotherMullissu-mukannishat-Ninua (?) Shalmaneser III (Šulmānu-ašarēdu, the god Shulmanu is pre-eminent) was king of the Neo-Assyrian Empir...

 

 

Ytterbium(II) iodide Identifiers CAS Number 19357-86-9 3D model (JSmol) Interactive image ChemSpider 3436141 ECHA InfoCard 100.214.149 EC Number 687-891-5 PubChem CID 4227090 CompTox Dashboard (EPA) DTXSID10401024 InChI InChI=1S/2HI.Yb/h2*1H;/q;;+2/p-2Key: SJLISRWUWZVXNZ-UHFFFAOYSA-L SMILES [I-].[I-].[Yb+2] Properties Chemical formula I2Yb Molar mass 426.854 g·mol−1 Appearance yellow solid[1] Melting point 780 °C (1,440 °F; 1,050 K)[1] (de...

Pour leur album, voir Gorillaz (album). Gorillaz Gorillaz en concert à Londres le 30 avril 2010.Informations générales Pays d'origine Royaume-Uni Genre musical Trip hop, rap-pop, hip-hop alternatif, rock alternatif, britpop, electronica, dub Années actives Depuis 1998 Labels Parlophone/EMI, Virgin/EMI, Warner Bros. Records[1] Site officiel www.gorillaz.com Composition du groupe Membres Virtuels :Stuart « 2D » TusspotMurdoc Niccals« Noodle »Russel HobbsCréate...

 

 

The Chișinău Choral Synagogue, 1913. The history of the Jews in Chișinău dates to the early 1700s, when Chișinău (then known as Kishinev) was located first in Moldavia and later from 1812 onwards in the Bessarabia region of the Russian Empire. Chișinău is now the capital city of Moldova and is the center of the country's Jewish population. As of 2022, around 10,000 of the 15,000 Moldovan Jews reside in Chișinău.[1] History Chișinău (Keshenev in Yiddish) was historically pa...

 

 

† Египтопитек Реконструкция внешнего вида египтопитека Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:Четвероно...

Medeatragedia Ritratto di Medea AutoreEuripide Titolo originaleΜήδεια Lingua originaleGreco antico Generetragedia AmbientazioneCorinto, Grecia Prima assoluta431 a.C.Teatro di Dioniso, Atene Personaggi Medea Giasone, marito di Medea nutrice pedagogo Creonte, re di Corinto[1] Egeo, re di Atene messaggero figli di Medea coro di donne corinzie Riduzioni cinematografiche Medea, di Pier Paolo Pasolini (1969) Medea, di Lars von Trier (1988)   Manuale Medea (Μήδεια, Mḕdeia)...

 

 

هذه المقالة عن المجموعة العرقية الأتراك وليس عن من يحملون جنسية الجمهورية التركية أتراكTürkler (بالتركية) التعداد الكليالتعداد 70~83 مليون نسمةمناطق الوجود المميزةالبلد  القائمة ... تركياألمانياسورياالعراقبلغارياالولايات المتحدةفرنساالمملكة المتحدةهولنداالنمساأسترالي�...

 

 

Thales Alenia SpaceIndustriAntariksaKantorpusatCannes, FranceTokohkunciJean-Loïc Galle, Presiden Direktur dan CEOLaba operasi2.1 miliar euro (2012)Karyawan7,500 (2012)IndukThales Group & FinmeccanicaSitus webThales Alenia Space Thales Alenia Space adalah perusahaan yang bergerak di bidang industri kendaraaan antariksa asal Prancis.[1] Perusahaan ini terbentuk dari gabungan antara Thales (saham 67%) dan Finmeccanica (33%), bersama dengan Telespazio di bawah naungan Thales Group.&#...

5th Commissioner of the National Football League Paul TagliabueTagliabue in August 20025th Commissioner of the NFLIn officeNovember 5, 1989 – September 1, 2006Preceded byPete RozelleSucceeded byRoger Goodell Personal detailsBornPaul John Tagliabue (1940-11-24) November 24, 1940 (age 83)Jersey City, New Jersey, U.S.SpouseChandler Minter (m. 1965)RelationsJohn D. Rockefeller V.(son-in-law)ChildrenAndrewEmilyParentsCharles TagliabueMary TagliabueResidence(s)Chevy Chase, Maryland,...

 

 

Core city in Honshu, Japan Core city in Honshu, JapanWakayama 和歌山市Core cityWakayama CityWakayama Castle, Nishinomaru Garden, Saikazaki, Kimiidera Temple, Downtown Wakayama viewed from the castle keep FlagSealLocation of Wakayama in Wakayama PrefectureWakayamaCoordinates: 34°14′N 135°10′E / 34.233°N 135.167°E / 34.233; 135.167CountryJapanRegionHonshu (Kansai)PrefectureWakayamaGovernment • MayorMasahiro ObanaArea • Total208.84 ...

 

 

R. O. KosasihRektor ITB 1959-1964 Rektor Institut Teknologi Bandung ke-2Masa jabatan1 November 1959 – 20 April 1964PendahuluPresidium: Prof. Ir. R. Soemono Prof. Ir. R. Goenarso Prof. dr. R. M. Djoehana Wiradikarta Prof. Ir. Soetedjo Prof. Dr. Ir. R. M. Soemantri BrodjonegoroPenggantiIr. R. Ukar Bratakusumah Informasi pribadiLahirRaden Otong Kosasih(1905-05-15)15 Mei 1905Cibodas, Majalaya, Jawa Barat, Hindia BelandaKebangsaanIndonesiaAlma materTH Bandung Ir. - TH DelftSunting k...

الهيئة العامة للصناعات العسكرية تفاصيل الوكالة الحكومية تأسست أغسطس 2017 المركز الرياض ، السعودية الإدارة المدير التنفيذي أحمد بن عبد العزيز العوهلي موقع الويب https://gami.gov.sa تعديل مصدري - تعديل   الهيئة العامة للصناعات العسكرية تأسست بقرار مجلس الوزراء السعودي في أغسطس 2017�...

 

 

Roman road that ran from York in England to the Antonine Wall in Scotland Dere StreetRoman RoadRoute of Dere StreetRoute informationLength226 mi (364 km)[146 mi or 235 km Eboracum to Trimontium; 80 mi or 129 km Trimontium to Veluniate]Time periodRoman BritainSaxon BritainNorman Britain Margary number8Major junctionsFromEboracumMajor intersectionsIsurium, Cataractonium, Morbium, Vinovium, Longovicium, Vindomora, Coria, Onnum, Habitancum, Bremenium, Trimon...