今天笔者在测试有关二叉树的测试用例时,发现一点一点给节点添加孩子操作十分繁琐,于是写了一个自动生成二叉树测试用例函数,供大家参考。
准备了一个二叉树节点类Node如下图所示
如下面代码所示,定义了一个TreegenerateUtil工具类,其中包含有静态方法generate自动生成随机二叉树,其中该方法有两个重载实现,该方法返回一个随机二叉树实例的根节点,其中两个重载方法都需要四个参数,其中前三个参数相同为currentDepth(树的深度),MaxDepth(树的最大深度),MaxValue(树的每个节点可以达到的最大值),最后一个参数第一个重载方法为Random类实例,目的是使得每次生成的随机树不同,而第二个重载方法的参数为Int数字,跟第一个重载方法也是同样的目的
package net.mooctest;
import java.util.Random;
/**
* @ClassName TreeUtils
* @Description
* @Author chougou
* @Date 2023年11月10日 21:19
* @Version 1.0
*/
public class TreegenerateUtils {
public static Node generate(int currentDepth, int MaxDepth, int MaxValue, Random random1) { //currentDepth为当前深度,MaxDepth为树的最大深度,MaxValue为节点可以达到的最大数,均可自行调节,random为随机数种子
//因为每次递归深度不同,因此currentDepth+random可作为随机数种子
if (currentDepth >= MaxDepth) { //当递归树的深度超过MaxDepth时候,递归结束
return new Node(random1.nextInt(MaxValue));
} else {
Node node = new Node(random1.nextInt(MaxValue));
//随机添加左孩子或者右孩子或者左右孩子或者无孩子
//1,只添加左孩子
int temp = random1.nextInt(100);
if (temp % 3 == 0) {
Node nodeleft = generate(currentDepth + 1, MaxDepth, MaxValue, random1);
node.left = nodeleft;
}
//2.只添加右孩子
if (temp % 3 == 1) {
Node noderight = generate(currentDepth + 1, MaxDepth, MaxValue, random1);
node.right = noderight;
}
//3.左右孩子均添加
if (temp % 3 == 2) {
Node noderight = generate(currentDepth + 1, MaxDepth, MaxValue, random1);
Node nodeleft = generate(currentDepth + 1, MaxDepth, MaxValue, random1);
node.left = nodeleft;
node.right = noderight;
}
//4.最后一种即什么也不添加
return node;
}
}
public static Node generate(int currentDepth, int MaxDepth, int MaxValue, int random) { //currentDepth为当前深度,MaxDepth为树的最大深度,MaxValue为节点可以达到的最大数,均可自行调节,random为随机数种子
Random random1 = new Random(currentDepth + random); //因为每次递归深度不同,因此currentDepth+random可作为随机数种子
if (currentDepth >= MaxDepth) { //当递归树的深度超过MaxDepth时候,递归结束
return new Node(random1.nextInt(MaxValue));
} else {
Node node = new Node(random1.nextInt(MaxValue));
//随机添加左孩子或者右孩子或者左右孩子或者无孩子
//1,只添加左孩子
int temp = random1.nextInt(100);
if (temp % 3 == 0) {
Node nodeleft = generate(currentDepth + 1, MaxDepth, MaxValue, random);
node.left = nodeleft;
}
//2.只添加右孩子
if (temp % 3 == 1) {
Node noderight = generate(currentDepth + 1, MaxDepth, MaxValue, random);
node.right = noderight;
}
//3.左右孩子均添加
if (temp % 3 == 2) {
Node noderight = generate(currentDepth + 1, MaxDepth, MaxValue, random);
Node nodeleft = generate(currentDepth + 1, MaxDepth, MaxValue, random);
node.left = nodeleft;
node.right = noderight;
}
//4.最后一种即什么也不添加
return node;
}
}
}
如下面程序示例,通过调用TreegenerateUtils的静态函数generate生成4个根节点,其中每个根节点均不相同
@Test
public void testTreegenerateUtils(){
//下面生成四个最大深度为10,节点可达到最大值为100的四个随机二叉树实例
Random random1=new Random();
Node root1=TreegenerateUtils.generate(1,10,100,random1.nextInt());
Node root2=TreegenerateUtils.generate(1,10,100,random1.nextInt());
Node root3=TreegenerateUtils.generate(1,10,100,random1);
Node root4=TreegenerateUtils.generate(1,10,100,random1);
}