【二叉树】如何构建一个包含大量随机数节点的二叉树测试用例

【二叉树】如何构建一个包含大量随机数节点的二叉树测试用例


前言

今天笔者在测试有关二叉树的测试用例时,发现一点一点给节点添加孩子操作十分繁琐,于是写了一个自动生成二叉树测试用例函数,供大家参考。


一、案例准备

准备了一个二叉树节点类Node如下图所示

二、自动生成随机二叉树工具类(TreegenerateUtils)

  如下面代码所示,定义了一个TreegenerateUtil工具类,其中包含有静态方法generate自动生成随机二叉树,其中该方法有两个重载实现,该方法返回一个随机二叉树实例的根节点,其中两个重载方法都需要四个参数,其中前三个参数相同为currentDepth(树的深度),MaxDepth(树的最大深度),MaxValue(树的每个节点可以达到的最大值),最后一个参数第一个重载方法为Random类实例,目的是使得每次生成的随机树不同,而第二个重载方法的参数为Int数字,跟第一个重载方法也是同样的目的

java 复制代码
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)?

  如下面程序示例,通过调用TreegenerateUtils的静态函数generate生成4个根节点,其中每个根节点均不相同

java 复制代码
 @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);
    }

运行结果展示:(每个根节点均不相同)

相关推荐
shushangyun_18 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习
她说..18 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
学渣超19 小时前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构
掉鱼的猫19 小时前
Agent Harness 实战指南:构建生产级 AI Agent 的"马具"框架
java·llm·aigc
带刺的坐椅19 小时前
Agent Harness 实战指南:构建生产级 AI Agent 的"马具"框架
java·ai·llm·agent·solon-ai
c2385619 小时前
互斥锁高频面试题全解:从基础概念到底层实现,一文通关
java·c++·面试·职场和发展
error:(20 小时前
【系统与实战双精通】VS Code 调试 ROS2 Python 节点与 Launch 系统指南
android·java·python
Tian_Hang20 小时前
Eclipse Ditto 的权限策略
java·服务器·前端·网络·ide·ubuntu·eclipse
小蓝波21 小时前
docker 的命令
java·docker·容器
AI人工智能+电脑小能手21 小时前
【大白话说Java面试题 第155题】【06_Spring篇】第15题:Spring 如何解决循环依赖问题?
java·spring·循环依赖·三级缓存·aop代理