- import java.util.Scanner;
- class Node {
- int value;
- Node left, right;
- public Node(int item) {
- value = item;
- left = right = null;
- }
- }
- class DrzewoBin {
- Node root;
- DrzewoBin() {
- root = null;
- }
- void insert(int wartosc) {
- root = insertRekurencyjnie(root, wartosc);
- }
- Node insertRekurencyjnie(Node node, int wartosc) {
- if (node == null) {
- node = new Node(wartosc);
- return node;
- }
- if (wartosc < node.value)
- node.left = insertRekurencyjnie(node.left, wartosc);
- else if (wartosc > node.value)
- node.right = insertRekurencyjnie(node.right, wartosc);
- return node;
- }
- void printPostorder() {
- printPostorderRekurencyjnie(root);
- }
- void printPostorderRekurencyjnie(Node node) {
- if (node == null)
- return;
- printPostorderRekurencyjnie(node.left);
- printPostorderRekurencyjnie(node.right);
- System.out.print(node.value + " ");
- }
- int height(Node node) {
- if (node == null)
- return 0;
- return 1 + Math.max(height(node.left), height(node.right));
- }
- Node rotateRight(Node y) {
- Node x = y.left;
- Node T2 = x.right;
- x.right = y;
- y.left = T2;
- return x;
- }
- Node rotateLeft(Node x) {
- Node y = x.right;
- Node T2 = y.left;
- y.left = x;
- x.right = T2;
- return y;
- }
- Node balance(Node node) {
- int balanceFactor = height(node.left) - height(node.right);
- if (balanceFactor > 1) {
- if (height(node.left.left) >= height(node.left.right)) {
- return rotateRight(node);
- } else {
- node.left = rotateLeft(node.left);
- return rotateRight(node);
- }
- } else if (balanceFactor < -1) {
- if (height(node.right.right) >= height(node.right.left)) {
- return rotateLeft(node);
- } else {
- node.right = rotateRight(node.right);
- return rotateLeft(node);
- }
- }
- return node;
- }
- Node balanceTree(Node node) {
- if (node == null)
- return null;
- node.left = balanceTree(node.left);
- node.right = balanceTree(node.right);
- return balance(node);
- }
- public static void main(String[] args) {
- DrzewoBin drzewo = new DrzewoBin();
- Scanner scanner = new Scanner(System.in);
- System.out.println("Wprowadź elementy drzewa oddzielone spacjami:");
- // Wczytywanie elementów drzewa z konsoli
- String input = scanner.nextLine();
- String[] elements = input.split("s+");
- // Dodawanie elementów do drzewa
- for (String element : elements) {
- drzewo.insert(Integer.parseInt(element));
- }
- System.out.println("Zawartość drzewa przed dodaniem niezrównoważonych elementów:");
- drzewo.printPostorder();
- // Dodawanie niezrównoważonych elementów
- drzewo.insert(9);
- drzewo.insert(10);
- System.out.println("nZawartość drzewa po dodaniu niezrównoważonych elementów:");
- drzewo.printPostorder();
- // Balansowanie drzewa
- drzewo.root = drzewo.balanceTree(drzewo.root);
- System.out.println("nDrzewo zostało zbalansowane:");
- System.out.println("nZawartość drzewa po zbalansowaniu:");
- drzewo.printPostorder();
- }
- }