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

这篇博客详细介绍了如何创建树的结构,包括最复杂情况的字符串表示法和完全二叉树的数组表示法。文章提供了创建树的代码,并展示了层次遍历、求树高度和结点数量的算法。此外,还强调了不同树构建方法对算法测试的影响,但算法本身不受构建方法的影响。
摘要由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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值