- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经编写了一个可用的二叉搜索树,并希望构建一些 JUnit 测试来配合它。我正在研究三项:一项用于查找最大值(按序遍历),一项用于删除该最大值,一项用于检查我的二叉树是否平衡。我已经写了前两个,但不太清楚如何完成最后一个测试——检查平衡。我希望得到一些指导,因为我觉得我忽略了一些东西。
我的测试方法:
public class BSTreePreLabTest {
@Test
public void testFindMax() {
BSTree<Integer> tree = new BSTree<Integer>();
tree.addElement(15);
tree.addElement(16);
tree.addElement(17);
tree.addElement(18);
tree.addElement(19);
tree.addElement(20);
assertEquals("20", tree.findMax().toString());
}
@Test
public void testRemoveMax() {
BSTree<Integer> tree = new BSTree<Integer>();
tree.addElement(15);
tree.addElement(16);
tree.addElement(17);
tree.addElement(18);
tree.addElement(19);
tree.addElement(20);
tree.removeMax();
assertEquals("Inorder traversal: [15, 16, 17, 18, 19]", tree.toString());
}
还有我的主要 BinarySearchTree 方法,供引用(如果需要):
public class BSTree<T> {
private BSTreeNode<T> root = null;
private int count;
public BSTree(T element) {
root = new BSTreeNode<T>(element);
count = 1;
}
public BSTree() {
root = null;
count = 0;
}
public void addElement(T element) {
if (isEmpty()) {
root = new BSTreeNode<T>(element);
}
else {
BSTreeNode<T> current = root;
BSTreeNode<T> previous = null;
Comparable<T> comparableElement = (Comparable<T>) element;
while (current != null) {
if (comparableElement.compareTo(current.getElement()) < 0) {
previous = current;
current = current.getLeft();
}
else {
previous = current;
current = current.getRight();
}
}
BSTreeNode<T> newNode = new BSTreeNode<T>(element);
if (comparableElement.compareTo(previous.getElement()) < 0)
previous.setLeft(newNode);
else
previous.setRight(newNode);
}
count++;
}
public boolean isEmpty() {
return root == null;
}
public int size() {
return count;
}
public T find(T targetElement) throws ElementNotFoundException {
BSTreeNode<T> current = findNode(targetElement, root);
if (current == null)
throw new ElementNotFoundException("BSTree");
return (current.getElement());
}
private BSTreeNode<T> findNode(T targetElement, BSTreeNode<T> next) {
if (next == null)
return null;
if (next.getElement().equals(targetElement))
return next;
BSTreeNode<T> temp = findNode(targetElement, next.getLeft());
if (temp == null)
temp = findNode(targetElement, next.getRight());
return temp;
}
public T removeElement(T targetElement) throws ElementNotFoundException {
T result = null;
if (isEmpty())
throw new ElementNotFoundException("BSTree");
else {
BSTreeNode<T> parent = null;
if (((Comparable<T>) targetElement).equals(root.getElement())) {
result = root.getElement();
BSTreeNode<T> temp = replacement(root);
if (temp == null)
root = null;
else {
root.setElement(temp.getElement());
root.setRight(temp.getRight());
root.setLeft(temp.getLeft());
}
} else {
parent = root;
if (((Comparable) targetElement).compareTo(root.getElement()) < 0)
result = removeElement(targetElement, root.getLeft(), parent);
else
result = removeElement(targetElement, root.getRight(), parent);
}
}
count--;
return result;
}
private T removeElement(T targetElement, BSTreeNode<T> node,
BSTreeNode<T> parent) throws ElementNotFoundException {
T result = null;
if (node == null)
throw new ElementNotFoundException("BSTree");
else {
if (((Comparable<T>) targetElement).equals(node.getElement())) {
result = node.getElement();
BSTreeNode<T> temp = replacement(node);
if (parent.getRight() == node)
parent.setRight(temp);
else
parent.setLeft(temp);
} else {
parent = node;
if (((Comparable) targetElement).compareTo(node.getElement()) < 0)
result = removeElement(targetElement, node.getLeft(),
parent);
else
result = removeElement(targetElement, node.getRight(),
parent);
}
}
return result;
}
private BSTreeNode<T> replacement(BSTreeNode<T> node) {
BSTreeNode<T> result = null;
if ((node.getLeft() == null) && (node.getRight() == null))
result = null;
else if ((node.getLeft() != null) && (node.getRight() == null))
result = node.getLeft();
else if ((node.getLeft() == null) && (node.getRight() != null))
result = node.getRight();
else {
BSTreeNode<T> current = node.getRight();
BSTreeNode<T> parent = node;
while (current.getLeft() != null) {
parent = current;
current = current.getLeft();
}
current.setLeft(node.getLeft());
if (node.getRight() != current) {
parent.setLeft(current.getRight());
current.setRight(node.getRight());
}
result = current;
}
return result;
}
public String toString()
{
ArrayList<T> temp = new ArrayList<T>();
inOrder(root, temp);
return "Inorder traversal: " + temp.toString();
}
public Iterator<T> iterator()
{
return iteratorInOrder();
}
public Iterator<T> iteratorInOrder()
{
ArrayList<T> tempList = new ArrayList<T>();
inOrder(root, tempList);
return tempList.iterator();
}
public T findMax(){
T result = null;
if (isEmpty())
throw new ElementNotFoundException ("binary tree");
else {
BSTreeNode<T> current = root;
while (current.getRight() != null)
current = current.getRight();
result = current.getElement();
}
return result;
}
public T removeMax(){
T result = null;
if (isEmpty())
throw new ElementNotFoundException("binary tree");
else
{
if (root.getRight() == null)
{
result = root.getElement();
root = root.getLeft();
}
else
{
BSTreeNode<T> parent = root;
BSTreeNode<T> current = root.getRight();
while (current.getRight() != null)
{
parent = current;
current = current.getRight();
}
result = current.getElement();
parent.setRight(current.getLeft());
}
count--;
}
return result;
}
protected void inOrder(BSTreeNode<T> node, ArrayList<T> tempList) {
if (node != null) {
inOrder(node.getLeft(), tempList);
tempList.add(node.getElement());
inOrder(node.getRight(), tempList);
}
}
}
最佳答案
你可以编写一个函数来计算左右子树的高度
int height(Node node)
{
if (node == null)
return 0;
return 1 + Math.max(height(node.left), height(node.right));
}
然后,您可以编写另一个方法来检查树是否平衡
boolean isBalanced(Node node)
{
int lh;
int rh;
if (node == null)
return true;
lh = height(node.left);
rh = height(node.right);
if (Math.abs(lh - rh) <= 1
&& isBalanced(node.left)
&& isBalanced(node.right)) {
return true;
}
return false;
}
然后,您可以编写一个 JUnit 测试用例来测试您的 isBalanced()。
希望这会有所帮助!
关于Java - 平衡 BinarySearchTree 的 JUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47082014/
我在理解以下内容时遇到问题: public int sort(char[] arr, int index) { if(!isEmpty()) { index = lef
为什么如果我放 tree.addElement(10, tree.root); 它有效,但如果我再次这样做 tree.addElement(20, tree.root); 不起作用?我只想向树添加元素
我有下面的代码,我用它来实现 BinarySearchTree。不知何故,它没有构建二叉树。任何人都可以帮助解决问题吗? typedef struct BinarySearchTree { s
对于作业,我需要编写代码,将字符串作为输入并计算该字符串中最常用的单词。 我们需要使用名为“WordCount”的结构的二叉搜索树来实现此目的,该结构包含字符数组和单词出现次数的计数。 这就是结构的定
我目前正在使用 BST,我的插入方法有一些问题,尽管这对我来说似乎很合乎逻辑。调试后,我发现我使用的变量赋值有问题,就像每次我尝试插入一个节点时,它都会作为根插入,因此打印出来,“不允许重复”。 为此
我希望不断地查看我的 BinarySearchTree,以防 File f 存在重复值。 ,而不是在 File f 的第一个实例结束一次被发现。我需要返回 File f 的所有实例. 现在这是我查找
我们的任务是创建一个具有一些基本功能的二叉搜索树。我觉得如果不是因为作业中包含的文件,我们需要遵守这些文件,以便评分者使用他们的评分程序实现我们的代码,我觉得我能够通过。给学生一个名为“Factory
Blockquote 如何在 BinarySearchTree.h 中实现 removeNode()? // DEFINITION AND IMPLEMENTATION OF BinaryNode.h
我已经编写了一个可用的二叉搜索树,并希望构建一些 JUnit 测试来配合它。我正在研究三项:一项用于查找最大值(按序遍历),一项用于删除该最大值,一项用于检查我的二叉树是否平衡。我已经写了前两个,但不
我目前正在学习数据结构,现在在 BinarySearchTree。 实验问题:“考虑一种二叉搜索树的方法,该方法决定树是否高度平衡。” 当我进行实验时,不知怎的,我在测试输出中得到了 NullPoin
我被要求为学校做一个项目,这是一个使用二叉搜索树的字典。我在使用removeWord 函数时遇到了一个大问题。我需要释放需要删除的单词,但在删除根时无法保留指向它的指针。这是我的代码(我只保留了一个案
我需要修改我创建的二叉搜索树以确保它是平衡的。我只需要根据我的说明修改添加和删除方法。这是我目前拥有的: package proj; public class BinarySearchTree>{
我有一个二叉搜索树,我想创建一个方法 allocateFirst。 此方法应该找到树中具有最小值的节点,并且相应地更新树的“first”属性。 我有很多方法,但我不想将所有方法都包含在这里,因为我想让
我需要为我的算法 II 类(class)“创建一个由二叉搜索树 (BST) 实现的优先级队列”。但是,我不确定您将如何使用二叉搜索树作为优先级队列。有人可以澄清作业要求我做什么吗? 作为引用,以下是
我在编写一些作业时遇到了一些问题。我应该编写一个通用二叉搜索树实用程序,包括一个返回树的后序遍历的 ArrayList 的方法。我的代码可以编译,但它会为除空树之外的所有树抛出 NullPointer
我的添加方法遇到问题,我相信错误发生在公共(public)方法中传递的参数中,但是我不确定我的私有(private)帮助器方法是否也没有添加正确的变量。 这是我的 addMethod 的说明 add(
我正在尝试解决 testdome.com 中的 C# 编程问题,但我发现了有关性能的问题。如何解决? 二叉搜索树 using System; public class Node { publi
我是一名优秀的程序员,十分优秀!