简单完全二叉树的实现

本文介绍了如何使用Java构建并遍历完全二叉树。通过set和get方法定义树节点,利用递归进行先序、中序和后序遍历,确保二叉树构建正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子
树”,其次序不能随意颠倒,是有序树的一种。
二叉树主要有以下性质:
若根结点的层次为1,则二叉树第i层最多有2的(i-1)次方个结点。
在高度为k的二叉树中,则最多有2的k次方-1个结点(k≥0)
设一棵二叉树节点个数为n,则父节点个数为n/2。
一棵具有n个结点的完全二叉树,对序号为i(0≤i<n)的结点,则:
若i=0,则i为根结点,无父母结点;若i >0,则i的父母结点序号为:
若2i+1<n,则i的左孩子结点序号为2i+1;否则i无左孩子。
若2i+2<n,则i的右孩子结点序号为2i+2;否则i无右孩子。

要实现二叉树,首先我们也得先创建节点,然后再把节点连接成一颗二叉树即可。

创建节点:
public class TreeNode {
	private int value;
	private TreeNode LeftNode;
	private TreeNode RightNode;
}

一个节点有一个值域和一个左边引用和右边引用,值域用来存放该节点的值,左右
两个引用分别用来指向它的左子树节点和右子树节点。上面的代码再加上构造函数

和set及get方法就是一个完整的树节点了。


我这里实现的是完全二叉树,完全二叉树是除最后一层外,每一层上的节点数均达
到最大值;在最后一层上只缺少右边的若干结点。
先创建一个整型数组,然后把这些整型数组都赋值到TreeNode中,
TreeNode node = new TreeNode(value,null,null);
我们也是要初始时候把左右引用赋值为null的,然后把这些节点都存储起来,再遍

历他们,给引用赋值,完成二叉树的构建。


//创建树的节点,value为一个int数组
for(int i=0; i<value.length; i++){
	TreeNode tree_node = new TreeNode(value[i],null,null);
	list.add(tree_node);//添加到队列中
}
//把节点连接成为树,父节点个数由二叉树性质所知为size/2,但是不要包括到那
//个可能没有两个子树的父节点,所以要size/2-1;
	for(int i=0; i<list.size()/2-1; i++){//遍历队列
	    TreeNode tempNode = list.get(i);//获取节点
	    tempNode.setLeftNode(list.get(2*i+1));//获取节点的左子树
	    tempNode.setRightNode(list.get(2*i+2));//获取节点右子树
		//左右子树依据二叉树性质得到
	}
	//完全二叉树有一个父节点有可能只有一个子节点,也可能有两个节点,所以要单独拿出来连接
	int nodeIndex = list.size()/2-1;//取到有变数的父节点下标
	TreeNode parentNode=list.get(list.size()/2-1);//拿到该父节点
	parentNode.setLeftNode(list.get(2*nodeIndex+1));//此节点一定有左子节点
		
	if(list.size()%2==1){//如果节点总数为奇数,表示该父节点还有右子节点
		parentNode.setRightNode(list.get(2*nodeIndex+2));
	}


以上就是我们创建一个完全二叉树的过程,要检验我们创建的是否是对的,就要遍
历该二叉树,查看数据是否是对的。
二叉树的遍历有三种方式,先序遍历,中序遍历,后序遍历,
分别为以下解释;
先序遍历树:先访问根节点,然后访问左子树,最后访问右子树
中序遍历树:先访问左子树,然后访问根节点,最后访问右子树
后续遍历树:先访问左子树,然后访问右子树,最后访问根节点
我通过先序遍历检验该树的创建是对的,方法如下:


public void firstSearch(TreeNode root){//传入树根节点
		if(root == null){//如果根节点为空
			return;
		}
		System.out.print(root.getValue()+",");//输出该节点值
		firstSearch(root.getLeftNode());//递归获取左节点
		firstSearch(root.getRightNode());//递归获取右节点
	}


通过递归调用我们方便的遍历了整个二叉树,也检验我的二叉树的创建没有问题;

中序遍历就是把先序遍历的输出语句移到递归获取左节点的下一句执行即可,

后序遍历就是把线序遍历的输出语句移到最后一句执行即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值