Naloga 3
This commit is contained in:
parent
1f2ae5b63a
commit
97c67bea67
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user