BAEL-3400 (#8113)
* BAEL-3400 * BALE-3400 | moved to algorithm-miscellaneous-5 * BAEL-3400 | added modifiers
This commit is contained in:
parent
cdeb947e42
commit
f2d9829b91
Binary file not shown.
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 10 KiB |
@ -0,0 +1,33 @@
|
|||||||
|
package com.baeldung.algorithms.balancedbinarytree;
|
||||||
|
|
||||||
|
public class BalancedBinaryTree {
|
||||||
|
|
||||||
|
public static boolean isBalanced(Tree tree) {
|
||||||
|
return isBalancedRecursive(tree, -1).isBalanced;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Result isBalancedRecursive(Tree tree, int depth) {
|
||||||
|
if (tree == null) {
|
||||||
|
return new Result(true, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result leftSubtreeResult = isBalancedRecursive(tree.left(), depth + 1);
|
||||||
|
Result rightSubtreeResult = isBalancedRecursive(tree.right(), depth + 1);
|
||||||
|
|
||||||
|
boolean isBalanced = Math.abs(leftSubtreeResult.height - rightSubtreeResult.height) <= 1;
|
||||||
|
boolean subtreesAreBalanced = leftSubtreeResult.isBalanced && rightSubtreeResult.isBalanced;
|
||||||
|
int height = Math.max(leftSubtreeResult.height, rightSubtreeResult.height) + 1;
|
||||||
|
|
||||||
|
return new Result(isBalanced && subtreesAreBalanced, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class Result {
|
||||||
|
private final boolean isBalanced;
|
||||||
|
private final int height;
|
||||||
|
|
||||||
|
private Result(boolean isBalanced, int height) {
|
||||||
|
this.isBalanced = isBalanced;
|
||||||
|
this.height = height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package com.baeldung.algorithms.balancedbinarytree;
|
||||||
|
|
||||||
|
public class Tree {
|
||||||
|
private final int value;
|
||||||
|
private final Tree left;
|
||||||
|
private final Tree right;
|
||||||
|
|
||||||
|
public Tree(int value, Tree left, Tree right) {
|
||||||
|
this.value = value;
|
||||||
|
this.left = left;
|
||||||
|
this.right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int value() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tree left() {
|
||||||
|
return left;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tree right() {
|
||||||
|
return right;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("[%s, %s, %s]",
|
||||||
|
value,
|
||||||
|
left == null ? "null" : left.toString(),
|
||||||
|
right == null ? "null" : right.toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.baeldung.algorithms.balancedbinarytree;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
|
||||||
|
public class BalancedBinaryTreeUnitTest extends BinaryTreeDataProvider {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBalancedTrees_whenCallingIsBalanced_ShouldReturnTrue() {
|
||||||
|
for (Tree tree : balancedTrees()) {
|
||||||
|
assertTrue(toString(tree) + " should be balanced", BalancedBinaryTree.isBalanced(tree));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenUnbalancedTrees_whenCallingIsBalanced_ShouldReturnFalse() {
|
||||||
|
for (Tree tree : unbalancedTrees()) {
|
||||||
|
assertFalse(toString(tree) + " should not be balanced", BalancedBinaryTree.isBalanced(tree));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String toString(Tree tree) {
|
||||||
|
return tree != null ? tree.toString() : "null";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
package com.baeldung.algorithms.balancedbinarytree;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
class BinaryTreeDataProvider {
|
||||||
|
|
||||||
|
static Collection<Tree> 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<Tree> 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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user