From 0d25f15db76eb19da22c752d0d4e748a95018730 Mon Sep 17 00:00:00 2001 From: Macieg Date: Tue, 5 Nov 2019 02:40:19 +0100 Subject: [PATCH] BAEL-3400 (#8113) * BAEL-3400 * BALE-3400 | moved to algorithm-miscellaneous-5 * BAEL-3400 | added modifiers --- .../src/test/resources/graph.png | Bin 9637 -> 10454 bytes .../BalancedBinaryTree.java | 33 +++++++++ .../algorithms/balancedbinarytree/Tree.java | 34 +++++++++ .../BalancedBinaryTreeUnitTest.java | 26 +++++++ .../BinaryTreeDataProvider.java | 69 ++++++++++++++++++ 5 files changed, 162 insertions(+) create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java create mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java create mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java diff --git a/algorithms-miscellaneous-2/src/test/resources/graph.png b/algorithms-miscellaneous-2/src/test/resources/graph.png index 7165a517824fec3ed31dea351d9b37dc4176b875..12af62c131e254c7c054c1710262f3c678dc5b7a 100644 GIT binary patch literal 10454 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 bjv*WVR4N1mQKkd;6+tf))fLL*%!2+GWIx3h literal 9637 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 balancedTrees() { + return Arrays.asList( + null, + leaf(1), + tree(1, leaf(2), leaf(3)), + tree( + 1, + leaf(2), + tree(3, leaf(4), null) + ), + tree( + 1, + tree( + 2, + tree(3, leaf(4), null), + leaf(5) + ), + tree( + 6, + leaf(7), + tree(8, null, leaf(9)) + ) + ) + ); + } + + static Collection unbalancedTrees() { + return Arrays.asList( + tree( + 1, + tree(2, leaf(3), null), + null + ), + tree( + 1, + tree( + 2, + tree(3, leaf(4), leaf(5)), + null + ), + tree(6, leaf(7), null) + ), + tree( + 1, + tree(2, leaf(3), null), + tree( + 4, + tree(5, leaf(6), leaf(7)), + null + ) + ) + ); + } + + private static Tree leaf(int value) { + return new Tree(value, null, null); + } + + private static Tree tree(int value, Tree left, Tree right) { + return new Tree(value, left, right); + } +}