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



    前言

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


    一、案例准备

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

    在这里插入图片描述


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


      如下面代码所示,定义了一个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;
    
            }
    
    
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90


    三、如何调用随机二叉树工具类(TreegenerateUtils)?


      如下面程序示例,通过调用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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行结果展示:(每个根节点均不相同)
    在这里插入图片描述

  • 相关阅读:
    关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事
    玩客云 线刷Armbian 搭配Alist 阿里云盘 Jellyfin NovaVideoPlayer搞电视墙
    一份笔记让你从 15K 涨薪并跳槽到32K+16
    vs2019+qgis+qt学习总结
    中断操作:AbortController学习笔记
    共享WiFi贴项目地推技巧,轻松学会推广!
    web前端面试题附答案039-css里插入js变量,scss最具创新的一个功能
    tcp rst 情况
    大数据在电力行业的应用案例100讲(十七)-基于微服务架构的营配贯通设计
    执行npm的时候报权限问题的解决方案
  • 原文地址:https://blog.csdn.net/haobabiu/article/details/134340345