binary tree data structure c
V tomto hloubkovém výukovém programu o binárním stromu v jazyce C ++ jsou vysvětleny typy, reprezentace, procházení, aplikace a implementace binárních stromů v jazyce C ++:
Binární strom je široce používaná stromová datová struktura. Pokud má každý uzel stromu nejvýše dva podřízené uzly, pak se strom nazývá binární strom.
Takže typický binární strom bude mít následující komponenty:
- Levý podstrom
- Kořenový uzel
- Správný podstrom
=> Dávejte pozor na kompletní seznam výukových programů C ++ v této sérii.
Co se naučíte:
- Binární strom v C ++
- Druhy binárního stromu
- Reprezentace binárního stromu
- Implementace binárního stromu v C ++
- Binární strom Traversal
- Aplikace binárního stromu
- Závěr
- Doporučené čtení
Binární strom v C ++
Obrázkové znázornění binárního stromu je uvedeno níže:
V daném binárním stromu je maximální počet uzlů na jakékoli úrovni 2l-1kde „l“ je číslo úrovně.
V případě kořenového uzlu na úrovni 1 je tedy maximální počet uzlů = 21-1= 20= 1
Protože každý uzel v binárním stromu má maximálně dva uzly, bude maximální počet uzlů na další úrovni 2 * 2l-1.
co jsou nejlepší poskytovatelé e-mailů
Vzhledem k binárnímu stromu hloubky nebo výšky h je maximální počet uzlů v binárním stromu výšky h = 2h- 1.
Proto v binárním stromu o výšce 3 (zobrazeném výše) je maximální počet uzlů = 23-1 = 7.
Nyní pojďme diskutovat o různých typech binárních stromů.
Druhy binárního stromu
Níže jsou uvedeny nejběžnější typy binárních stromů.
# 1) Celý binární strom
Binární strom, ve kterém má každý uzel 0 nebo 2 děti, se nazývá plný binární strom.
Nahoře je zobrazen plný binární strom, ve kterém vidíme, že všechny jeho uzly kromě listových uzlů mají dvě děti. Pokud L je počet listových uzlů a ‚l‘ je počet interních nebo nelistových uzlů, pak pro úplný binární strom L = l + 1.
# 2) Kompletní binární strom
Kompletní binární strom má všechny úrovně vyplněné kromě poslední úrovně a poslední úroveň má všechny své uzly až nalevo.
Strom zobrazený výše je úplný binární strom. Typickým příkladem úplného binárního stromu je binární halda, o které si povíme v pozdějších cvičeních.
# 3) Perfektní binární strom
Binární strom se nazývá dokonalý, když všechny jeho vnitřní uzly mají dvě děti a všechny listové uzly jsou na stejné úrovni.
Příklad binárního stromu zobrazený výše je dokonalým binárním stromem, protože každý z jeho uzlů má dvě děti a všechny uzly listu jsou na stejné úrovni.
Dokonalý binární strom výšky h má 2h- 1 počet uzlů.
# 4) Degenerovaný strom
Binární strom, kde má každý vnitřní uzel pouze jedno dítě, se nazývá degenerovaný strom.
Strom zobrazený výše je zdegenerovaný strom. Pokud jde o výkon tohoto stromu, zdegenerované stromy jsou stejné jako propojené seznamy.
# 5) Vyvážený binární strom
Binární strom, ve kterém se hloubka dvou podstromů každého uzlu nikdy neliší o více než 1, se nazývá vyvážený binární strom.
Binární strom zobrazený výše je vyvážený binární strom, protože hloubka dvou podstromů každého uzlu není větší než 1. AVL stromy, o kterých budeme diskutovat v následujících cvičeních, jsou běžným vyváženým stromem.
Reprezentace binárního stromu
Binární strom je přidělena paměť dvěma způsoby.
# 1) Postupné zastoupení
Toto je nejjednodušší technika ukládání stromové datové struktury. K uložení uzlů stromu se používá pole. Počet uzlů ve stromu určuje velikost pole. Kořenový uzel stromu je uložen u prvního indexu v poli.
Obecně platí, že pokud je uzel uložen na ithumístění, pak je to levé a pravé dítě uloženo na místě 2i a 2i + 1.
Zvažte následující binární strom.
Sekvenční znázornění výše uvedeného binárního stromu je následující:
Ve výše uvedeném znázornění vidíme, že levé a pravé dítě každého uzlu je uloženo na místech 2 * (node_location) a 2 * (node_location) +1.
Například, umístění uzlu 3 v poli je 3. Takže jeho levé dítě bude umístěno na 2 * 3 = 6. Jeho pravé dítě bude na místě 2 * 3 +1 = 7. Jak vidíme v poli, děti ze 3, které jsou 6 a 7, jsou umístěny na místě 6 a 7 v poli.
Sekvenční reprezentace stromu je neefektivní, protože pole, které se používá k uložení uzlů stromu, zabírá spoustu místa v paměti. Jak strom roste, tato reprezentace se stává neúčinnou a obtížně spravovatelnou.
Tato nevýhoda je překonána uložením uzlů stromu do propojeného seznamu. Pokud je strom prázdný, bude první umístění s kořenovým uzlem nastaveno na 0.
# 2) Reprezentace propojeného seznamu
V tomto typu reprezentace se k uložení uzlů stromu používá propojený seznam. Několik uzlů je rozptýleno v paměti na nesouvislých místech a uzly jsou připojeny pomocí vztahu rodič-dítě jako strom.
Následující diagram ukazuje reprezentaci propojeného seznamu pro strom.
Jak je znázorněno ve výše uvedené reprezentaci, každý uzel propojeného seznamu má tři komponenty:
- Levý ukazatel
- Datová část
- Pravý ukazatel
Levý ukazatel má ukazatel na levé dítě uzlu; pravý ukazatel má ukazatel na pravé dítě uzlu, zatímco datová část obsahuje skutečná data uzlu. Pokud pro daný uzel (listový uzel) neexistují žádné podřízené položky, jsou levý a pravý ukazatel pro tento uzel nastaveny na null, jak je znázorněno na výše uvedeném obrázku.
Implementace binárního stromu v C ++
Dále vyvíjíme program binárního stromu pomocí reprezentace propojeného seznamu v C ++. Pomocí struktury deklarujeme jeden uzel a poté pomocí třídy vytvoříme propojený seznam uzlů.
#include using namespace std; struct bintree_node{ bintree_node *left; bintree_node *right; int data; } ; class bst{ bintree_node *root; public: bst(){ root=NULL; } int isempty() { return(root==NULL); } void insert(int item); void displayBinTree(); void printBinTree(bintree_node *); }; void bst::insert(int item){ bintree_node *p=new bintree_node; bintree_node *parent; p->data=item; p->left=NULL; p->right=NULL; parent=NULL; if(isempty()) root=p; else{ bintree_node *ptr; ptr=root; while(ptr!=NULL){ parent=ptr; if(item>ptr->data) ptr=ptr->right; else ptr=ptr->left; } if(itemdata) parent->left=p; else parent->right=p; } } void bst::displayBinTree(){ printBinTree(root); } void bst::printBinTree(bintree_node *ptr){ if(ptr!=NULL){ printBinTree(ptr->left); cout<<' '<data<<' '; printBinTree(ptr->right); } } int main(){ bst b; b.insert(20); b.insert(10); b.insert(5); b.insert(15); b.insert(40); b.insert(45); b.insert(30); cout<<'Binary tree created: '< Výstup:
Binární strom vytvořen:
5 10 15 20 30 40 45
Binární strom Traversal
Traverze jsme již probrali v našem základním tutoriálu o stromech. V této části implementujeme program, který vloží uzly do binárního stromu a také předvede všechny tři procházení, tj. Inorder, preorder a postorder, pro binární strom.
#include using namespace std; //binary tree node declaration struct bintree_node{ bintree_node *left; bintree_node *right; char data; } ; class bintree_class{ bintree_node *root; public: bintree_class(){ root=NULL; } int isempty() { return(root==NULL); } void insert_node(int item); void inorder_seq(); void inorder(bintree_node *); void postorder_seq(); void postorder(bintree_node *); void preorder_seq(); void preorder(bintree_node *); }; void bintree_class::insert_node(int item){ bintree_node *p=new bintree_node; bintree_node *parent; p->data=item; p->left=NULL; p->right=NULL; parent=NULL; if(isempty()) root=p; else{ bintree_node *ptr; ptr=root; while(ptr!=NULL) { parent=ptr; if(item>ptr->data) ptr=ptr->right; else ptr=ptr->left; } if(itemdata) parent->left=p; else parent->right=p; } } void bintree_class::inorder_seq() { inorder(root); } void bintree_class::inorder(bintree_node *ptr) { if(ptr!=NULL){ inorder(ptr->left); cout<<' '<data<<' '; inorder(ptr->right); } } void bintree_class::postorder_seq() { postorder(root); } void bintree_class::postorder(bintree_node *ptr) { if(ptr!=NULL){ postorder(ptr->left); postorder(ptr->right); cout<<' '<data<<' '; } } void bintree_class::preorder_seq() { preorder(root); } void bintree_class::preorder(bintree_node *ptr) { if(ptr!=NULL){ cout<<' '<data<<' '; preorder(ptr->left); preorder(ptr->right); } } int main() { bintree_class bintree; bintree.insert_node('A'); bintree.insert_node('B'); bintree.insert_node('C'); bintree.insert_node('D'); bintree.insert_node('E'); bintree.insert_node('F'); bintree.insert_node('G'); cout<<'Inorder traversal:'< Výstup:
co je funkční testování s příkladem
Inorder traversal:
A B C D E F G
Procházení zásilkového obchodu:
G F E D C B A
Předobjednat průchod:
A B C D E F G
Aplikace binárního stromu
Binární strom se používá v mnoha aplikacích pro ukládání dat.
Níže jsou uvedeny některé důležité aplikace binárních stromů:
- Binární vyhledávací stromy: Binární stromy se používají ke konstrukci binárního vyhledávacího stromu, který se používá v mnoha vyhledávacích aplikacích, jako jsou sady a mapy v mnoha jazykových knihovnách.
- Hash stromy: Používá se k ověřování hodnot hash hlavně ve specializovaných aplikacích pro podpis obrazu.
- Hromady: Hromady se používají k implementaci prioritních front, které se používají pro směrovače, plánování procesorů v operačním systému atd.
- Huffmanovo kódování: Huffmanův kódovací strom se používá v kompresních algoritmech (jako je komprese obrázků) i v kryptografických aplikacích.
- Syntaxový strom: Překladače často vytvářejí syntaxové stromy, které nejsou ničím jiným než binárními stromy k analýze výrazů použitých v programu.
Závěr
Binární stromy jsou široce používané datové struktury napříč softwarovým průmyslem. Binární stromy jsou stromy, jejichž uzly mají nejvýše dva podřízené uzly. Viděli jsme různé typy binárních stromů, jako je plný binární strom, úplný binární strom, dokonalý binární strom, zdegenerovaný binární strom, vyvážený binární strom atd.
Data binárního stromu lze také procházet pomocí technik procházení inorder, preorder a postorder, které jsme viděli v našem předchozím tutoriálu. V paměti může být binární strom reprezentován pomocí propojeného seznamu (nesouvislá paměť) nebo polí (sekvenční reprezentace).
Reprezentace propojeného seznamu je ve srovnání s poli efektivnější, protože pole zabírají spoustu místa.
=> Podívejte se na nejlepší výukové kurzy C ++ zde.
Doporučené čtení
- Datová struktura stromu AVL a haldy v C ++
- Datová struktura stromu B a stromu B + v C ++
- Struktura dat fronty v C ++ s ilustrací
- Skládejte datovou strukturu v C ++ s ilustrací
- Datová struktura kruhového propojeného seznamu v C ++ s ilustrací
- Propojená datová struktura seznamu v C ++ s ilustrací
- Úvod do datových struktur v C ++
- Struktura dat prioritní fronty v C ++ s ilustrací