关于树的一些算法(带测试用例)(持续更新)

这篇博客详细介绍了如何创建树的结构,包括最复杂情况的字符串表示法和完全二叉树的数组表示法。文章提供了创建树的代码,并展示了层次遍历、求树高度和结点数量的算法。此外,还强调了不同树构建方法对算法测试的影响,但算法本身不受构建方法的影响。
摘要由CSDN通过智能技术生成

前言:
我们平时写的关于树的算法都是直接写算法,就是比如写一个前序遍历就是

public void preOrder(TreeNode root)
{
   
//前序遍历
}

但是很少有写一个完整的测试用例的,即写一个函数按照图的样子创建一棵树,然后让这个函数返回根节点,然后就可以在主函数中定义一个树节点获取这个根节点,剩下的就是调用这些树的算法就好了。简而言之就是这篇博客不仅有常见的树的算法,还有真实的测试用例。
一、创建一棵树
首先就是定义树节点这个类

class TreeNode
{
   
	Object data;
	public TreeNode left;
	public TreeNode right;
	public TreeNode(Object data)
	{
   
		this.data=data;
		this.left=null;
		this.right=null;
	}
}

1、首先讲最复杂情况,就是这个树的节点值五花八门,比如有数字(1 2 3),字母(h k D)还有可能有一些其他的乱七八糟的(*—/+?)这些都可以作为接节点值(所以前面把树节点的类型定义为Object),所以这样的情况下这些值是不可能放在数组里的(因为数组里的都要求同一类型),所以这种情况下把树节点的值放在字符串里,然后每个值用空格格开。
比如下面的这个树的节点值就可以用这个字符串表示:

String str="A - + 2 / 0 D 0 3 0 0 0 0 *";

在这里插入图片描述
解释为什么树的节点值没有0,但是字符串里确有0的,这是因为要按照完全二叉树的顺序写进字符串,按照完全二叉树的顺序如果在没有节点的地方就用0表示,这些0很关键,在后面的打印节点时候要判断。那为什么*后面的0没写进去,因为是按照完全二叉树的形式写,所以D是没有右节点的,所以不写最后一个0也是完全二叉树(这部分是完全二叉树的概念,理解这里对后面构造左右孩子有帮助。)
现在我们只是有了节点的值,还不是树节点的类型,那么接下来的思路是定义一个泛型是TreeNode类型的List,然后通过新建每一个树节点,然后把相应的节点值传给新建节点的方式把树节点都存在list中,然后在list中指明节点的左右孩子。完整代码如下(不看这些文字直接看代码也可以)

public class BianliTree {
   
	public TreeNode create(String str)
	{
   
		List<TreeNode> list=new LinkedList<TreeNode>();
		for(int i=0;i<str.split(" ").length;i++)
		{
   
			list.add(new TreeNode(str.split(" ")[i]));
		}
		for(int i=0;i<str.split(" ").length/2-1;i++)
		{
   
			list.get(i).left=list.get(2*i+1);
			list.get(i).right=list.get(2*i+2);
		}
		//最后一个父节点,因为可能没有右孩子,所以单独拿出来处理。
		int temp=str.split(" ").length/2-1;
		list.get(temp).left=list.get(2*temp+1);
		//如果节点数量是奇数,才有右孩子
		if(str.split(" ").length%2==1)
		{
   
			list.get(temp).right=list.get(2*temp+2);
		}
		return list.get(0);
	}
	public void visit(TreeNode root)
	{
   
		if(!root.data.equals("0"))
		{
   
			System.out.print(root
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
遗传算法可以用来生成测试用例,它是一种基于生物进化理论的优化算法。下面是一个简单的步骤,说明如何使用遗传算法生成测试用例: 1. 定义问题:确定测试目标和测试需求,需要测试一个软件的特定功能或性能。 2. 确定适应度函数:将问题转化为适应度函数,该函数衡量每个个体的适应程度。在测试用例生成中,适应度函数可以根据测试目标和需求来评估测试用例的质量。 3. 初始化种群:随机生成一组初始测试用例作为种群的个体。 4. 选择操作:根据适应度函数选择部分个体作为父代,用于产生下一代个体。选择操作可以使用不同的方法,如轮盘赌选择、锦标赛选择等。 5. 交叉操作:从父代中选择两个个体,并通过交叉操作生成两个子代。交叉操作可以使用不同的方法,如单点交叉、多点交叉等。 6. 变异操作:对子代进行变异操作,以引入新的基因组合。变异操作可以随机改变个体的某些基因或参数。 7. 评估适应度:对新一代个体进行适应度评估,使用定义好的适应度函数。 8. 判断终止条件:判断是否满足终止条件,例如达到最大迭代次数或找到满足要求的测试用例。 9. 重复步骤4到步骤8,直到满足终止条件。 10. 输出结果:输出找到的最优测试用例测试用例集。 需要注意的是,遗传算法生成的测试用例可能并不是最优解,但它可以帮助发现一些较好的测试用例,以覆盖软件的不同功能和边界情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值