25
СТЕБЛА Аудиториски вежби 6а

Auditoriski 6 stebla 1

Embed Size (px)

DESCRIPTION

Stebla

Citation preview

Page 1: Auditoriski 6 stebla 1

СТЕБЛА

Аудиториски вежби 6а

Page 2: Auditoriski 6 stebla 1

ОПШТИ И БИНАРНИ СТЕБЛА

Стебло претставува колекција елементи, наречени јазли, од кои што еден се издвојува како корен, заедно со релацијата родител која што дефинира хиерархиска структура. Јазелот по правило содржи податок од произволен тип, а графички се означува со кругче со буква, бројка или стринг во него.

Патека на дрво е низа од јазли n1, n2,...nk, каде јазелот ni-1 е родител на ni, i [2,k]

или јазелот ni е потомок на ni-1

Пример: патека е А, B, Е но не и K, E, F.

Патеката не мора да почне со коренот. Пример: H, M.

Page 3: Auditoriski 6 stebla 1

ОПШТИ И БИНАРНИ СТЕБЛА

Должина на патека е бројот на врски во низата од јазли (патеката) (за еден помалку од бројот на јазли во патеката) .Пример: должина на патеката А, B, Е е 2.

Висина на стебло e патека која започнува со коренот завршува со лист и има најголема должина од сите можни патеки. Пример: висина на стеблото е 3.

Длабочина на јазел е должина на единствената патека од коренот до самиот јазел. Пример: длабочина на јазелот Е е 2.

Page 4: Auditoriski 6 stebla 1

ОПШТИ И БИНАРНИ СТЕБЛА

Терминални јазли (листови) се оние јазли кои немаат наследници, а останатите се внатрешни јазли. Посебен јазел е коренот кој нема родител. Пример: терминални листови се K, L, F, G, M, I и J

внатрешни јазли се B, C, D, E и H

Слични стебла - јазлите и врските на двете стебла се соодветни (ако јазелот во едното стебло има врска на лево, соодветниот јазел на другото стебло има врска во лево. Исто и за десните врски.)

Еквивалентни стебла - покрај тоа што се со иста структура (јазли и врски), и вредностите во јазлите им се исти.

Page 5: Auditoriski 6 stebla 1

ОПШТИ И БИНАРНИ СТЕБЛА

Бинарно стебло претставува конечно множество на елементи, неаречени јазли, кое е или празно или се состои од корен и две различни бинарни стебла наречени лево подстебло и десно подстебло. Левото подстебло и десното подстебло се разликуваат.

Секое стебло може да се трансформира во бинарно стебло. Десен брат - десно дете репрезентација

Page 6: Auditoriski 6 stebla 1

БИНАРНИ СТЕБЛА

Максимален број на јазли во бинарно стебло: •М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

Page 7: Auditoriski 6 stebla 1

РЕПРЕЗЕНТАЦИЈА НА БИНАРНИ СТЕБЛА

  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;   }  }

Page 8: Auditoriski 6 stebla 1

ЗАДАЧИ

Задача 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

Page 9: Auditoriski 6 stebla 1

ЗАДАЧИ

(за левото потстебло): 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 изминувањето и се одредува кој елемент е корен на потстеблото. Со задебелени букви се прикажани корените на потстеблата. (за левото потстебло)

Page 10: Auditoriski 6 stebla 1

2. inorder и postorder:postorder: LDO: DCEBHGJLKIFA - бидејќи A е последна во низата, таа е корен

inorder: LOD: DCBEAGHFJ ILK - па во inorder се гледа која низа е лево потстебло postorder: DCEBinorder: DCBEpostorder: DC inorder: DC - значи D е лево од C

Пак е можно да се реконструира стеблото.

Page 11: Auditoriski 6 stebla 1

3. preorder и postorder:Ќе докажеме со пример дека не е можно еднозначно да се утврди структурата на едно стебло. Нека се дадени две стебла:

Се добиваат исти низи од две различни структури!

Page 12: Auditoriski 6 stebla 1

Задач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 израз

Page 13: Auditoriski 6 stebla 1

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); } 

Page 14: Auditoriski 6 stebla 1

Задачa 3. Да се напише функција INORDER изминување на бинарно дрво претставено со склад. Покажувач ко коренот на стеблото е Т.

Решение:

Page 15: Auditoriski 6 stebla 1

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;}

}

Page 16: Auditoriski 6 stebla 1

Задач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 );}

Page 17: Auditoriski 6 stebla 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;}

Page 18: Auditoriski 6 stebla 1

Задач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);   } } 

Page 19: Auditoriski 6 stebla 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;   } } 

Page 20: Auditoriski 6 stebla 1

НАНИЖАНИ БИНАРНИ СТЕБЛА

Во претставата на бинарни стебла има многу покажувачи кон 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 изминување.

Стеблата кога се нанижани имаат јазел водач.

Page 21: Auditoriski 6 stebla 1

НАНИЖАНИ БИНАРНИ СТЕБЛА

Page 22: Auditoriski 6 stebla 1

РЕПРЕЗЕНТАЦИЈА НА НАНИЖАНИ БИНАРНИ СТЕБЛА

  private static class Node {     Node left;     Node right;     int data; char ltag, rtag;     Node(int newData) {       left = null;       right = null;       data = newData;     }   }

Page 23: Auditoriski 6 stebla 1

ЗАДАЧИЗадача 1 Даден е алгебарскиот израз . Да се претстави во облик на нанижано бинарно стебло.

Решение: Стеблото се изградува спрема приоритетот

2xeY

•Доколку p.left e null (за листовите или за јазлите каде што се разгранува само едната страна) тогаш воведуваме: p.left = Q, каде Q е претходник на Р во некое изминување (inorder). •Ставаме p.ltag=’-‘ ако е нишка, инаку P.ltag=’+‘ ако е врска. (за да се разликува дали е врска или нишка) •За десната нулта врска се врзува наследникот во соодветното изминување.

Page 24: Auditoriski 6 stebla 1

ЗАДАЧИЗадача 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;}

Page 25: Auditoriski 6 stebla 1

Наследник на 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;}