This commit is contained in:
Gašper Dobrovoljc 2025-04-27 19:20:04 +02:00
parent 1f2ae5b63a
commit 97c67bea67
No known key found for this signature in database
GPG Key ID: 0E7E037018CFA5A5
2 changed files with 83 additions and 64 deletions

View File

@ -1,12 +1,13 @@
@SuppressWarnings("SuspiciousNameCombination") @SuppressWarnings("SuspiciousNameCombination")
public class AVLDrevo { public class AVLDrevo {
static class Item { static class Node {
public int value; int value;
public int count; int count = 1;
Node left, right;
int height = 1;
public Item(int value) { public Node(int value) {
this.value = value; this.value = value;
this.count = 1;
} }
@Override @Override
@ -15,18 +16,8 @@ public class AVLDrevo {
} }
} }
static class Node {
Item item;
Node left, right;
int height = 1;
public Node(int value) {
item = new Item(value);
}
}
Node root; Node root;
StringBuilder traversal; private StringBuilder traversal = new StringBuilder();
private int getHeight(Node node) { private int getHeight(Node node) {
if (node == null) { if (node == null) {
@ -60,10 +51,10 @@ public class AVLDrevo {
return y; return y;
} }
private Node minValueNode(Node node) { private Node maxValueNode(Node node) {
Node current = node; Node current = node;
while (current.left != null) { while (current.right != null) {
current = current.left; current = current.right;
} }
return current; return current;
} }
@ -101,10 +92,10 @@ public class AVLDrevo {
return new Node(value); return new Node(value);
} }
if (value == node.item.value) { if (value == node.value) {
node.item.count++; node.count++;
return node; return node;
} else if (value < node.item.value) { } else if (value < node.value) {
node.left = vstavi(node.left, value); node.left = vstavi(node.left, value);
} else { } else {
node.right = vstavi(node.right, value); node.right = vstavi(node.right, value);
@ -121,26 +112,26 @@ public class AVLDrevo {
System.out.println(traversal.substring(0, traversal.length() - 1)); System.out.println(traversal.substring(0, traversal.length() - 1));
} }
private void najdi(Node node, int value) { private Node najdi(Node node, int value) {
if (node == null) { if (node == null) {
traversal.append("x").append(","); traversal.append("x").append(",");
return; return null;
} }
if (value == node.item.value) { if (value == node.value) {
traversal.append(node.item.value).append(","); traversal.append(node.value).append(",");
return; return node;
} else if (value < node.item.value) { } else if (value < node.value) {
traversal.append(node.item.value).append(","); traversal.append(node.value).append(",");
najdi(node.left, value); return najdi(node.left, value);
} else { } else {
traversal.append(node.item.value).append(","); traversal.append(node.value).append(",");
najdi(node.right, value); return najdi(node.right, value);
} }
} }
public void izbrisi(int kljuc) { public void izbrisi(int kljuc) {
izbrisi(root, kljuc); root = izbrisi(root, kljuc);
} }
private Node izbrisi(Node node, int value) { private Node izbrisi(Node node, int value) {
@ -148,28 +139,27 @@ public class AVLDrevo {
return null; return null;
} }
if (value < node.item.value) { if (value < node.value) {
node.left = izbrisi(node.left, value); node.left = izbrisi(node.left, value);
} else if (value > node.item.value) { } else if (value > node.value) {
node.right = izbrisi(node.right, value); node.right = izbrisi(node.right, value);
} else { } else {
if (node.item.count > 1) { if (node.count > 1) {
node.item.count--; node.count--;
return node; return node;
} }
Node tmp;
if (node.left == null) { if (node.left == null) {
tmp = node.right; return node.right;
return tmp;
} else if (node.right == null) { } else if (node.right == null) {
tmp = node.left; return node.left;
return tmp;
} }
tmp = minValueNode(node.right); Node max = maxValueNode(node.left);
node.item = tmp.item; node.value = max.value;
node.right = izbrisi(node.right, tmp.item.value); node.count = max.count;
max.count = 1;
node.left = izbrisi(node.left, max.value);
} }
node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right)); node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right));
@ -191,18 +181,23 @@ public class AVLDrevo {
if (node == null) { if (node == null) {
return; return;
} }
traversal.append(node.item).append(","); traversal.append(node).append(",");
premiPregled(node.left); premiPregled(node.left);
premiPregled(node.right); premiPregled(node.right);
} }
public void najnizjiSkupniPredhodnik(int a, int b) { public void najnizjiSkupniPredhodnik(int a, int b) {
if (najdi(root, a) == null || najdi(root, b) == null) {
System.out.println("x");
return;
}
Node node = lca(root, a, b); Node node = lca(root, a, b);
if (node == null) { if (node == null) {
System.out.println("x"); System.out.println("x");
return; return;
} }
System.out.println(node.item.value); System.out.println(node.value);
} }
private Node lca(Node node, int a, int b) { private Node lca(Node node, int a, int b) {
@ -210,9 +205,9 @@ public class AVLDrevo {
return null; return null;
} }
if (a < node.item.value && b < node.item.value) { if (a < node.value && b < node.value) {
return lca(node.left, a, b); return lca(node.left, a, b);
} else if (a > node.item.value && b > node.item.value) { } else if (a > node.value && b > node.value) {
return lca(node.right, a, b); return lca(node.right, a, b);
} }
@ -230,8 +225,8 @@ public class AVLDrevo {
} }
int sum = 0; int sum = 0;
if (node.item.value >= lower && node.item.value <= upper) { if (node.value >= lower && node.value <= upper) {
sum += node.item.value * node.item.count; sum += node.value * node.count;
} }
sum += sumBounds(node.left, lower, upper); sum += sumBounds(node.left, lower, upper);
@ -255,11 +250,23 @@ public class AVLDrevo {
if (k == null) { if (k == null) {
return null; return null;
} }
k -= node.item.count; k -= node.count;
if (k <= 0) { if (k <= 0) {
System.out.println(node.item.value); System.out.println(node.value);
return null; return null;
} }
return kSmallest(node.right, k); return kSmallest(node.right, k);
} }
static void beautyPrint(AVLDrevo.Node node, int l) {
if (node == null)
return;
for (int i = 0; i < l; i++) {
System.out.print("\t");
}
System.out.println(node);
beautyPrint(node.left, l + 1);
beautyPrint(node.right, l + 1);
}
} }

View File

@ -1,16 +1,28 @@
import java.util.Random;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
Random rng = new Random(10);
AVLDrevo tree = new AVLDrevo(); AVLDrevo tree = new AVLDrevo();
tree.vstavi(8); int min = -1000;
tree.vstavi(3); int max = 1000;
tree.vstavi(10); for (int i = 1; i < 2000; i++) {
tree.vstavi(1); for (int j = 0; j < 10; j++) {
tree.vstavi(6); tree.vstavi(rng.nextInt(2000) - 1000);
tree.vstavi(14); }
tree.vstavi(6); for (int k = 0; k < 4; k++) {
tree.vsotaVMejah(3, 6); for (int j = 0; j < 30; j++) {
tree.najdi(9); tree.izbrisi(rng.nextInt(2000) - 1000);
tree.ktiNajmanjsi(2); }
tree.najnizjiSkupniPredhodnik(1, 6); }
}
tree.premiPregled();
for (int i = 1; i < 200; i++) {
tree.ktiNajmanjsi(i);
}
for (int i = 0; i < 100; i++) {
int val = rng.nextInt(max - min) + min;
tree.vsotaVMejah(val, val + 200);
}
} }
} }