From 1f2ae5b63a3da3293f227cc3115d9657df60e475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C5=A1per=20Dobrovoljc?= Date: Thu, 17 Apr 2025 08:16:22 +0200 Subject: [PATCH] Naloga 3 WIP --- naloga3/.gitignore | 29 ++ naloga3/.idea/.gitignore | 8 + .../inspectionProfiles/Project_Default.xml | 19 ++ naloga3/.idea/misc.xml | 6 + naloga3/.idea/modules.xml | 8 + naloga3/.idea/vcs.xml | 6 + naloga3/naloga3.iml | 11 + naloga3/src/AVLDrevo.java | 265 ++++++++++++++++++ naloga3/src/Main.java | 16 ++ 9 files changed, 368 insertions(+) create mode 100644 naloga3/.gitignore create mode 100644 naloga3/.idea/.gitignore create mode 100644 naloga3/.idea/inspectionProfiles/Project_Default.xml create mode 100644 naloga3/.idea/misc.xml create mode 100644 naloga3/.idea/modules.xml create mode 100644 naloga3/.idea/vcs.xml create mode 100644 naloga3/naloga3.iml create mode 100644 naloga3/src/AVLDrevo.java create mode 100644 naloga3/src/Main.java diff --git a/naloga3/.gitignore b/naloga3/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/naloga3/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/naloga3/.idea/.gitignore b/naloga3/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/naloga3/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/naloga3/.idea/inspectionProfiles/Project_Default.xml b/naloga3/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..5b739d1 --- /dev/null +++ b/naloga3/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,19 @@ + + + + \ No newline at end of file diff --git a/naloga3/.idea/misc.xml b/naloga3/.idea/misc.xml new file mode 100644 index 0000000..eeb80f7 --- /dev/null +++ b/naloga3/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/naloga3/.idea/modules.xml b/naloga3/.idea/modules.xml new file mode 100644 index 0000000..68cd0ce --- /dev/null +++ b/naloga3/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/naloga3/.idea/vcs.xml b/naloga3/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/naloga3/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/naloga3/naloga3.iml b/naloga3/naloga3.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/naloga3/naloga3.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/naloga3/src/AVLDrevo.java b/naloga3/src/AVLDrevo.java new file mode 100644 index 0000000..0f9c9a9 --- /dev/null +++ b/naloga3/src/AVLDrevo.java @@ -0,0 +1,265 @@ +@SuppressWarnings("SuspiciousNameCombination") +public class AVLDrevo { + static class Item { + public int value; + public int count; + + public Item(int value) { + this.value = value; + this.count = 1; + } + + @Override + public String toString() { + return value + "/" + count; + } + } + + static class Node { + Item item; + Node left, right; + int height = 1; + + public Node(int value) { + item = new Item(value); + } + } + + Node root; + StringBuilder traversal; + + private int getHeight(Node node) { + if (node == null) { + return 0; + } + return node.height; + } + + private int getBalance(Node node) { + if (node == null) { + return 0; + } + return getHeight(node.left) - getHeight(node.right); + } + + private Node rightRotate(Node y) { + Node x = y.left; + y.left = x.right; + x.right = y; + y.height = 1 + Math.max(getHeight(y.left), getHeight(y.right)); + x.height = 1 + Math.max(getHeight(x.left), getHeight(x.right)); + return x; + } + + private Node leftRotate(Node x) { + Node y = x.right; + x.right = y.left; + y.left = x; + x.height = 1 + Math.max(getHeight(x.left), getHeight(x.right)); + y.height = 1 + Math.max(getHeight(y.left), getHeight(y.right)); + return y; + } + + private Node minValueNode(Node node) { + Node current = node; + while (current.left != null) { + current = current.left; + } + return current; + } + + private Node balance(Node node) { + int balance = getBalance(node); + + if (balance > 1 && getBalance(node.left) >= 0) { + return rightRotate(node); + } + + if (balance > 1 && getBalance(node.left) < 0) { + node.left = leftRotate(node.left); + return rightRotate(node); + } + + if (balance < -1 && getBalance(node.right) <= 0) { + return leftRotate(node); + } + + if (balance < -1 && getBalance(node.right) > 0) { + node.right = rightRotate(node.right); + return leftRotate(node); + } + + return node; + } + + public void vstavi(int kljuc) { + root = vstavi(root, kljuc); + } + + private Node vstavi(Node node, int value) { + if (node == null) { + return new Node(value); + } + + if (value == node.item.value) { + node.item.count++; + return node; + } else if (value < node.item.value) { + node.left = vstavi(node.left, value); + } else { + node.right = vstavi(node.right, value); + } + + node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right)); + + return balance(node); + } + + public void najdi(int kljuc) { + traversal = new StringBuilder(); + najdi(root, kljuc); + System.out.println(traversal.substring(0, traversal.length() - 1)); + } + + private void najdi(Node node, int value) { + if (node == null) { + traversal.append("x").append(","); + return; + } + + if (value == node.item.value) { + traversal.append(node.item.value).append(","); + return; + } else if (value < node.item.value) { + traversal.append(node.item.value).append(","); + najdi(node.left, value); + } else { + traversal.append(node.item.value).append(","); + najdi(node.right, value); + } + } + + public void izbrisi(int kljuc) { + izbrisi(root, kljuc); + } + + private Node izbrisi(Node node, int value) { + if (node == null) { + return null; + } + + if (value < node.item.value) { + node.left = izbrisi(node.left, value); + } else if (value > node.item.value) { + node.right = izbrisi(node.right, value); + } else { + if (node.item.count > 1) { + node.item.count--; + return node; + } + + Node tmp; + if (node.left == null) { + tmp = node.right; + return tmp; + } else if (node.right == null) { + tmp = node.left; + return tmp; + } + + tmp = minValueNode(node.right); + node.item = tmp.item; + node.right = izbrisi(node.right, tmp.item.value); + } + + node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right)); + + return balance(node); + } + + public void premiPregled() { + traversal = new StringBuilder(); + if (root == null) { + System.out.println("empty"); + return; + } + premiPregled(root); + System.out.println(traversal.substring(0, traversal.length() - 1)); + } + + private void premiPregled(Node node) { + if (node == null) { + return; + } + traversal.append(node.item).append(","); + premiPregled(node.left); + premiPregled(node.right); + } + + public void najnizjiSkupniPredhodnik(int a, int b) { + Node node = lca(root, a, b); + if (node == null) { + System.out.println("x"); + return; + } + System.out.println(node.item.value); + } + + private Node lca(Node node, int a, int b) { + if (node == null) { + return null; + } + + if (a < node.item.value && b < node.item.value) { + return lca(node.left, a, b); + } else if (a > node.item.value && b > node.item.value) { + return lca(node.right, a, b); + } + + return node; + } + + public void vsotaVMejah(int spodnjaMeja, int zgornjaMeja) { + int sum = sumBounds(root, spodnjaMeja, zgornjaMeja); + System.out.println(sum); + } + + private int sumBounds(Node node, int lower, int upper) { + if (node == null) { + return 0; + } + + int sum = 0; + if (node.item.value >= lower && node.item.value <= upper) { + sum += node.item.value * node.item.count; + } + + sum += sumBounds(node.left, lower, upper); + sum += sumBounds(node.right, lower, upper); + + return sum; + } + + public void ktiNajmanjsi(int indeks) { + Integer smallest = kSmallest(root, indeks); + if (smallest != null) { + System.out.println("x"); + } + } + + private Integer kSmallest(Node node, int index) { + if (node == null) { + return index; + } + Integer k = kSmallest(node.left, index); + if (k == null) { + return null; + } + k -= node.item.count; + if (k <= 0) { + System.out.println(node.item.value); + return null; + } + return kSmallest(node.right, k); + } +} diff --git a/naloga3/src/Main.java b/naloga3/src/Main.java new file mode 100644 index 0000000..3534b8f --- /dev/null +++ b/naloga3/src/Main.java @@ -0,0 +1,16 @@ +public class Main { + public static void main(String[] args) { + AVLDrevo tree = new AVLDrevo(); + tree.vstavi(8); + tree.vstavi(3); + tree.vstavi(10); + tree.vstavi(1); + tree.vstavi(6); + tree.vstavi(14); + tree.vstavi(6); + tree.vsotaVMejah(3, 6); + tree.najdi(9); + tree.ktiNajmanjsi(2); + tree.najnizjiSkupniPredhodnik(1, 6); + } +}