СТЕБЛА
Аудиториски вежби 6а
ОПШТИ И БИНАРНИ СТЕБЛА
Стебло претставува колекција елементи, наречени јазли, од кои што еден се издвојува како корен, заедно со релацијата родител која што дефинира хиерархиска структура. Јазелот по правило содржи податок од произволен тип, а графички се означува со кругче со буква, бројка или стринг во него.
Патека на дрво е низа од јазли n1, n2,...nk, каде јазелот ni-1 е родител на ni, i [2,k]
или јазелот ni е потомок на ni-1
Пример: патека е А, B, Е но не и K, E, F.
Патеката не мора да почне со коренот. Пример: H, M.
ОПШТИ И БИНАРНИ СТЕБЛА
Должина на патека е бројот на врски во низата од јазли (патеката) (за еден помалку од бројот на јазли во патеката) .Пример: должина на патеката А, B, Е е 2.
Висина на стебло e патека која започнува со коренот завршува со лист и има најголема должина од сите можни патеки. Пример: висина на стеблото е 3.
Длабочина на јазел е должина на единствената патека од коренот до самиот јазел. Пример: длабочина на јазелот Е е 2.
ОПШТИ И БИНАРНИ СТЕБЛА
Терминални јазли (листови) се оние јазли кои немаат наследници, а останатите се внатрешни јазли. Посебен јазел е коренот кој нема родител. Пример: терминални листови се K, L, F, G, M, I и J
внатрешни јазли се B, C, D, E и H
Слични стебла - јазлите и врските на двете стебла се соодветни (ако јазелот во едното стебло има врска на лево, соодветниот јазел на другото стебло има врска во лево. Исто и за десните врски.)
Еквивалентни стебла - покрај тоа што се со иста структура (јазли и врски), и вредностите во јазлите им се исти.
ОПШТИ И БИНАРНИ СТЕБЛА
Бинарно стебло претставува конечно множество на елементи, неаречени јазли, кое е или празно или се состои од корен и две различни бинарни стебла наречени лево подстебло и десно подстебло. Левото подстебло и десното подстебло се разликуваат.
Секое стебло може да се трансформира во бинарно стебло. Десен брат - десно дете репрезентација
БИНАРНИ СТЕБЛА
Максимален број на јазли во бинарно стебло: •Мaксимален број на јазли на ниво i на бинарното стебло е 2i-1, i≥1. •Мaксимален број на јазли во бинарното стебло со длабочина k е 2k-1, k ≥ 1.
Постојат 3 стандардни начинина изминување на стебло:
INORDER L O D (лево, корен, десно) PREORDER O L D (корен, лево, десно) POSTORDER L D O (лево, десно, корен)
Inorder : 2, 3, 4, 6, 7, 9, 13, 15, 17, 18, 20 Preorder: 15, 6, 3, 2, 4, 7, 13, 9, 18, 17, 20 Postorder: 2, 4, 3, 9, 13, 7, 6, 17, 20, 18, 15
РЕПРЕЗЕНТАЦИЈА НА БИНАРНИ СТЕБЛА
private static class Node { Node left; Node right; int data; Node(int newData) { left = null; right = null; data = newData; } }
public class BinaryTree { private Node root;
public void BinaryTree() { root = null; } }
ЗАДАЧИ
Задача 1 Да се покаже дека доколку се дадени низите на јазли на едно бинарно стебло добиени со preorder и inorder изминување, можно е да се е најде структурата на бинарно стебло. Дали е тоа можно да се постигне ако се дадени inorder и postorder изминувањата, односно preorder и postorder.
Решение: OLD preorder A B C D E F G H I J K L LOD inorder D C B E A G H F J I L K LDO postorder D C E B H G J L K I F A
ЗАДАЧИ
(за левото потстебло): preorder: BCDE -од тука се гледа коренот BInorder: DCBE -од тука потстеблото DC Prеorder: CD Inorder: DC - значи D е лево од C
(за десното потстебло):preorder: FGHIJKLinorder: GHFIJLK preorder: GH IJKL preorder: KL inorder: GH JILK inorder: LK
Можнo е.
1. preorder и inorder: Kоренот е A. Потоа се бара A во inorder изминувањето. Сé што е пред A во inorder
изминувањето спаѓа во левото потстебло. Па потоа се бара низата во preorder изминувањето и се одредува кој елемент е корен на потстеблото. Со задебелени букви се прикажани корените на потстеблата. (за левото потстебло)
2. inorder и postorder:postorder: LDO: DCEBHGJLKIFA - бидејќи A е последна во низата, таа е корен
inorder: LOD: DCBEAGHFJ ILK - па во inorder се гледа која низа е лево потстебло postorder: DCEBinorder: DCBEpostorder: DC inorder: DC - значи D е лево од C
Пак е можно да се реконструира стеблото.
3. preorder и postorder:Ќе докажеме со пример дека не е можно еднозначно да се утврди структурата на едно стебло. Нека се дадени две стебла:
Се добиваат исти низи од две различни структури!
Задачa 2. Да се напише функција која ги отпечатува информациите содржани во јазлите на бинарното дрво во PREODRER, INORDER и POSTORDER изминување.
Решение:
inorder изминување A * B – C ^ D + E / F infix израз
preorder изминување + - * A B ^ C D / E F prefix израз
postorder изминување A B * C D ^ - E F / + postfix израз
public void inorder(Node node) { if (node == null) return; inorder(node.left); System.out.print(node.data ); inorder(node.right); } public void preorder(Node node) { if (node == null) return; System.out.print(node.data ); preorder(node.left); preorder(node.right); }
private static class Node { Node left; Node right; int data; Node(int newData) { left = null; right = null; data = newData; } }
public void postorder(Node node) { if (node == null) return; postorder(node.left); postorder(node.right); System.out.print(node.data); }
Задачa 3. Да се напише функција INORDER изминување на бинарно дрво претставено со склад. Покажувач ко коренот на стеблото е Т.
Решение:
public void inorderUsingStack(Node t) { StackList s = new StackList();//prazen magacinNode p;p=t; // se pocnuva so p od korenwhile(1) {//odime do kraj vo leva nasoka
while(p!=NULL){ //ako p!=NULL ima levo podsteblo
s.push(p);//vo magacin se smestuva adresata na p p=p.left; //odi na levoto podsteblo }//ako magacinot e prazen, celoto steblo e izminato
if (s.isEmpty()) break;p= s.top;System.out.print(p.data);s.pop();
//odi na desnoto podsteblo i povtori ja posapkata//ako ima levo podsteblo
p=p.right;}
}
Задачa 4. Да се напише функција што го дава бројот на внатрешни јазли во бинарно дрво.
Решение:
public int insideNodes(Node t) { if ((t==null)||(t.left == null)&&( t.right == null)) return 0; else //postorder return(insideNodes(t.left)+insideNodes(t.right)+1 );}
Задачa 5. Да се напише функција што го дава бројот на листови во бинарно дрво.
Решение:
public int lifes(Node t) { if (t!=null) if ((t.left == null)&&( t.right == null)) return 1; else return(lifes(t.left)+lifes(t.right) ); else return 0;}
Задачa 6. Да се напише функција што за дадено бинарно дрво, ќе ја врати неговата максимална длабочина.
Решение:
public int maxDepth() { return(maxDepth(root)); }private int maxDepth(Node node) { if (node==null) { return(0); } else { int lDepth = maxDepth(node.left); int rDepth = maxDepth(node.right); return(Math.max(lDepth, rDepth) + 1); } }
Задачa 7. Да се напише функција која за дадено бинарно стебло ќе ги замени улогите на левиот и десниот покажувач на секој јазел. Добиеното стебло да се пресликува симетрично во однос на оригиналното. Да не се креира ново стебло.
Решение:
public void mirror() { mirror(root); }private void mirror(Node node) { if (node != null) { //preslikaj gi simericno levoto i desnoto podsteblo mirror(node.left); mirror(node.right); //smeni gi pokazuvacite za ovoj jazel Node temp = node.left; node.left = node.right; node.right = temp; } }
НАНИЖАНИ БИНАРНИ СТЕБЛА
Во претставата на бинарни стебла има многу покажувачи кон null(неискористени покажувачи). Ако има n јазли бројот на не-null врски е: n-1. Вкупниот број на врски е: 2n, од каде што следи дека бројот на null врски е: 2n-(n-1)=n+1
Кај нанижаните себла овие покажувачи кон NULL се заменуваат со корисни врски т.н. нишки.
Пример: inorder нанижано стебло•If ptr.left_child e null, тогаш овој покажувач нека покажува кон јазелот кој ќе биде посетен пред јазелот на кој покажува ptr во inorder изминување. •If ptr.right_child е null, тогаш овој покажувач нека покажува кон јазелот кој ќе биде посетен после јазелот на кој покажува ptr во inorder изминување.
Стеблата кога се нанижани имаат јазел водач.
НАНИЖАНИ БИНАРНИ СТЕБЛА
РЕПРЕЗЕНТАЦИЈА НА НАНИЖАНИ БИНАРНИ СТЕБЛА
private static class Node { Node left; Node right; int data; char ltag, rtag; Node(int newData) { left = null; right = null; data = newData; } }
ЗАДАЧИЗадача 1 Даден е алгебарскиот израз . Да се претстави во облик на нанижано бинарно стебло.
Решение: Стеблото се изградува спрема приоритетот
2xeY
•Доколку p.left e null (за листовите или за јазлите каде што се разгранува само едната страна) тогаш воведуваме: p.left = Q, каде Q е претходник на Р во некое изминување (inorder). •Ставаме p.ltag=’-‘ ако е нишка, инаку P.ltag=’+‘ ако е врска. (за да се разликува дали е врска или нишка) •За десната нулта врска се врзува наследникот во соодветното изминување.
ЗАДАЧИЗадача 2 Да се напише функција за наоѓање на претходникот и наследникот на јазелот Р во inorder изминување, во едно бинарно inorder нанижано стебло.
Решение:
1. Претходник на p. Со помош на p ќе се движиме низ стеблото додека не стигнеме до претходникот.
Пример на inorder изминување на некое стебло:CBDAFGE
public Node preth(Node p) {//ako na levo e niska//sme go nasle prethodnikot if(p.ltag==‘-’) return p->left;//inaku odi na levo od p p=p.left; while(p.rtag==‘+’) //ako e vrska//odi na desno se dodeka ima vrski p=p.right; //vrati go prethodnikot na p return p;}
Наследник на p. Со помош на p ќе се движиме низ стеблото додека не стигнеме до наследникот.
public Node nasled(Node p) {//ako na desno e niska//sme go nasle naslednikot if(p.rtag==‘-’) return p.right;//inaku odi na desno od p p=p.right; while(p.ltag==‘+’)//ako e vrska//odi na levo se dodeka ima vrski p=p.left;//vrati go naslednikot na p return p;}