我想用随机数创建一个二叉树。为此,我有一个生成树的函数和一个生成随机数的函数。作为实例变量,我有以下内容:
DB name
我认为所有generateRandomInt调用看起来都不“美丽”。有没有办法缩短或提高效率?还有没有一种方法可以随机创建一个二叉树(节点数)?我有以下方法可以向树中添加一些东西:
private static final int MIN_VALUE = 1;
private static final int MAX_VALUE = 100;
private static LinkedBinaryTree<Integer> tree = new LinkedBinaryTree<>();
private static Random random = new Random();
addRoot 添加根节点 insertLeftChild 和 insertRightChild 将左侧或右侧子节点添加到节点 insertChild 可以这样做,但是会检查左孩子或右孩子是否空闲, insertChildren 同时向节点添加左孩子和右孩子
addRoot(value)
insertLeftChild(node, value)
insertRightChild(node, value)
insertChild(node, value)
insertChildren(node, value1, value2)
public static int generateRandomInt(int MIN_VALUE, int MAX_VALUE) {
return random.nextInt((MAX_VALUE - MIN_VALUE) + 1) + MIN_VALUE;
}
答案 0 :(得分:3)
简单地添加另一个帮助器,例如:
public static int generateRandomInt() {
return generateRandomInt(MIN_VALUE, MAX_VALUE);
}
接下来,您可以创建简单地创建一个孩子并将其添加到根目录的辅助方法。然后在循环中调用该方法。
基本上,您在这里有一个模式:
所有这些都是在非常低的抽象级别上发生的。您应该添加一些有用的抽象,从而不必总是写下所有细节。
答案 1 :(得分:2)
您可以避免将MIN_VALUE
和MAX_VALUE
传递到各处,因为它们相同,因此可以从函数中删除参数(或创建代理)。
但是您将无法减少通话次数,因为结果无法缓存。
可以“修饰”代码的方法是使用终端递归函数。 像这样:
public static void addChild(int depth, Position<Integer> currentRoot) {
Position<Integer> leftChild = currentRoot.insertLeftChild(generateRandomInt());
Position<Integer> rightChild = currentRoot.insertRightChild(generateRandomInt());
if(depth > 0) {
addChild(depth - 1, leftChild);
addChild(depth - 1, rightChild);
}
}
您可能必须编辑insertChild()
方法以返回插入的节点。
编辑:调用方法两次以获取二叉树。
答案 2 :(得分:2)
类似于@GhostCat的建议,但是除了定义另一个函数外,您还可以在方法范围内定义一个Supplier<Integer>
。特别是如果随机函数的参数并不总是相同的(在另一种方法中使用时,边界可能不同),这可能是有利的。
而且,它又短了一点,因为本地声明的Supplier
不必具有过于描述性的名称。
public static void generateBinaryTree() {
Supplier<Integer> rand = () -> generateRandomInt(MIN_VALUE, MAX_VALUE);
Position<Integer> root = tree.addRoot(rand.get());
Position<Integer> child1 = tree.insertChild(root, rand.get());
...
}
更新:了解了addChild
和addChildren
之间的区别之后,很明显,您确实可以以递归方式将函数重写为addChildren(root, depth)
,如下所示:由@Kevin建议。