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