Naloga 3 WIP

This commit is contained in:
Gašper Dobrovoljc 2025-04-17 08:16:22 +02:00
parent b0ec0d4ec4
commit 1f2ae5b63a
No known key found for this signature in database
GPG Key ID: 0E7E037018CFA5A5
9 changed files with 368 additions and 0 deletions

29
naloga3/.gitignore vendored Normal file
View File

@ -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

8
naloga3/.idea/.gitignore generated vendored Normal file
View File

@ -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

View File

@ -0,0 +1,19 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyPep8Inspection" enabled="true" level="INFORMATION" enabled_by_default="true">
<option name="ignoredErrors">
<list>
<option value="W292" />
</list>
</option>
</inspection_tool>
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredIdentifiers">
<list>
<option value="tests.smoke.test_absences_sliding.TestAbsencesSliding.*" />
</list>
</option>
</inspection_tool>
</profile>
</component>

6
naloga3/.idea/misc.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_23" default="true" project-jdk-name="homebrew-23" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
naloga3/.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/naloga3.iml" filepath="$PROJECT_DIR$/naloga3.iml" />
</modules>
</component>
</project>

6
naloga3/.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

11
naloga3/naloga3.iml Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

265
naloga3/src/AVLDrevo.java Normal file
View File

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

16
naloga3/src/Main.java Normal file
View File

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