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