Binära Sökträd, kapitel 19 ”Naiva” binära sökträd Balancerade binära sökträd - AVL- träd - AA- träd
Vad är en sökträd? 7 2 9 11 1 5 3 Ett binärt träd där, för vilken som hälst nod i trädet alla noder som innehåller ett värde mindre än nodens värde befinner sig i det vänsta delträdet och alla noder som innehåller ett värde som är större en nodens värde befinner sig i det högra delträdet.
Är det ett sökträd? 7 2 9 11 1 5 8 3
Operationer Find() , findMin(), findMax() Insert() Remove()
Find(), Mycket kortare söktider!
Insert () 6 7 2 9 11 1 5 3
Insert () 6 7 2 9 11 1 5 3
Insert () 6 7 2 9 11 1 5 3
Insert () 7 2 9 6 11 1 5 3
Farliga specialfall! 7 8 13
Remove () a) Om noden är löv 7 2 9 11 1 5 3
Remove () b) Om noden har ett barn 7 2 9 11 1 5 3
Remove () c) Om noden har två barn 7 2 3 9 11 1 5 3 Ersätt värdet i noden med den minsta värdet i i det högra delträdet och sedan ta bort den noden 4
Implementation, BinaryNode class BinaryNode { Comparable element; BinaryNode left; BinaryNode right; BinaryNode( Comparable data) element=data; left=right=null; } 3
BinarySearchTree class BinarySearchTree{ BinaryNode root; public BinarySearchTree() { root=null; } public void insert( Comparable x){ root = insert(x, root); }
...och BinarySearchTree generic public class BinarySearchTree <AnyType extends Comparable<? super AnyType> > { Node <AnyType> root; public BinarySearchTree() { root=null; } -public void insert -public nbrOfNodes -public remove -public find .........andra......... }
Metoden insert() ....BinaryNode insert( Comparable x, BinaryNode t){ if(t==null) t=new BinaryNode(x); else if( x.compareTo(t.element)<0) t.left=insert(x,t.left); else if (x.compareTo(t.element)>0) t.right=insert(x,t.right); else throw new DuplicateException (); return t; }
Analys av binärasökträd operationer. a) balancerad b) obalancerad Exekverings tiden beror på djupet av den sista ”behandlade” noden
Balancerade binära sökträd AVL -träd Ett balancerad träd är ett träd där för vilken som hälst nod i trädet , skillnaden mellan höjden av vänstra delträdet och högra delträdet är inte större än 1. 12 8 16 4 10 14 Hh=1 Hv=2 2 6 Hv-Hh=2.-1=1
Balancerade binära sökträd AVL -träd Ett balancerad träd är ett träd där för vilken som hälst nod i trädet , skillnaden mellan höjden av vänstra delträdet och högra delträdet är inte större än 1. 12 8 16 4 10 14 Hh=0 Hv=1 2 6 Hv-Hh=1-0=1
Är följande träd balancerad? 1 insert 12 8 16 4 10 14 2 6
Rotation mellan nod och sitt vänster barn k1 k2 k2 C k1 B A B C A
Hur balanceras trädet ? k2 12 8 16 k1 4 10 14 2 6 1
Rotation mellan nod och sitt höger barn k1 k2 k2 A k1 C A B B C
AA- träd En ny nod skapas alltid som löv och har nivå 1. En horisontal länk är en förbindelse mellan en nod och sitt barn med samma nivå. Två horisonatala länkar är inte tilllåtna då ska operationen split utföras. 1 4 5 6 2 6 5 6 7 1 1 5 7
AA-träd Ingen vänster länk tilllåts, då ska operationen skew utföras 4 5 4 5
Operationen split() är en rotation med höger barn. 15 10 15 20 10 20 A B A B
Operationen skew() är en rotation med vänster barn 10 15 10 15 A B c A B c