27、数组存储完全二叉树

  • 思路: 简单介绍了用数组存储完全二叉树的问题,重点就是找到父节点和子节点的关系(Node = 2leftNode+1,Node = 2rightNode+1 ) 下面的代码就是二叉树用数组存储后,怎么对数组进行前中后遍历的问题。

  • 代码:

package tree;

public class ArrBinaryTreeDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int[] arr = {1,2,3,4,5,6,7,8,9};
		ArrayBinaryTree binaryTree = new ArrayBinaryTree(arr);
//		binaryTree.preOrder(0);
//		binaryTree.infixOrder(0);
		binaryTree.lastOrder(0);
		
	}

}

class ArrayBinaryTree{
	int[] arr;

	public ArrayBinaryTree(int[] arr) {
		super();
		this.arr = arr;
	}
	
	//前序遍历
	public void preOrder(int order) {
		if(arr == null || arr.length == 0 || order > arr.length-1) {
			return;
		}
		System.out.println(arr[order]);
		preOrder(2*order+1);
		preOrder(2*order+2);
	}
	//中序遍历
	public void infixOrder(int order) {
		if(arr == null || arr.length == 0 || order > arr.length-1) {
			return;
		}
		infixOrder(2*order+1);
		System.out.println(arr[order]);	
		infixOrder(2*order+2);
	}
	//后序遍历
	public void lastOrder(int order) {
		if(arr == null || arr.length == 0 || order > arr.length-1) {
			return;
		}
		
		lastOrder(2*order+1);
		lastOrder(2*order+2);
		System.out.println(arr[order]);
	}
	
	
}
<think>好的,用户想了解如何用数组实现完全二叉树的构造。首先,我需要回忆完全二叉树的特点。完全二叉树是除了最后一层外,其他层都是满的,并且最后一层的节点都靠左排列。这样的结构非常适合用数组来表示,因为可以避免空间的浪费。 接下来,我得整理数组存储的规则。通常根节点放在数组索引1的位置,这样左子节点是2*i,右子节点是2*i+1,父节点是i//2。不过有时候也会从0开始,但用户的问题可能更倾向于传统的从1开始的方法,这样计算更方便。 然后,构建方法需要包括如何将元素按层序填充到数组中。比如给定一组元素,如何确定它们在数组中的位置,以及如何处理空节点。完全二叉树不需要存储NULL,因为结构紧凑,所以数组的大小应该是元素个数n,位置i的左右子节点在2i和2i+1的位置,只要不超过n即可。 接下来,我需要考虑具体的实现步骤。比如初始化数组,按层序逐个放入元素,然后如何从数组还原结构。可能还需要示例代码,比如Python中的列表操作,如何根据索引找到父子节点。 还要注意用户提到的参考资料,引用3中提到处理NULL的情况,但完全二叉树可能不需要,因为结构紧凑。但用户的问题是关于完全二叉树的,所以可能不需要处理NULL,除非构建过程中有缺失,但完全二叉树的定义是没有缺失的,所以数组应该是连续填充的。 然后,可能需要给出一个例子,比如元素列表[1,2,3,4,5,6,7],对应的数组索引1到7,每个节点的左右子节点位置是否正确。这样用户能更直观理解。 最后,实现代码部分需要用数组存储,并提供查找父节点和子节点的方法。可能需要一个类,包含数组属性和相关方法。同时,用户可能关心如何验证结构的正确性,比如遍历数组并检查父子关系。 还要考虑是否要处理从0开始索引的情况,但根据常见实现,可能从1开始更直观。然后,总结数组实现的优缺点,比如节省指针空间,但插入删除效率低,适合静态数据。 检查是否有遗漏点,比如完全二叉树的性质是否在数组中得到正确体现,比如节点i的父节点位置是否正确,左右子节点是否存在等。确保步骤清晰,逻辑正确。</think>### 完全二叉树数组实现方法 #### 1. 数组存储规则 完全二叉树的结构特性使得其可以**按层序填充到连续数组**中。定义如下: - **根节点**存储数组索引$1$的位置(也可从$0$开始,但$1$更便于计算) - 节点$i$的**左子节点**索引为$2i$,**右子节点**索引为$2i+1$ - 节点$i$的**父节点**索引为$\lfloor i/2 \rfloor$ 例如元素$[A,B,C,D,E,F,G]$的数组表示为: $$[ \_,A,B,C,D,E,F,G]$$ (首位置空置以便计算) #### 2. 构建方法 **步骤说明:** 1. **初始化数组**:确定完全二叉树节点数$n$,创建长度为$n+1$的数组(索引$1$到$n$) 2. **层序填充**:按照层次遍历顺序将元素依次存入数组 3. **关系验证**:检查每个节点的子节点索引是否超出数组长度 **示例代码(Python):** ```python class ArrayBinaryTree: def __init__(self, elements): self.tree = [None] + elements # 索引0留空 self.size = len(elements) def left_child(self, index): left = 2 * index return left if left <= self.size else None def right_child(self, index): right = 2 * index + 1 return right if right <= self.size else None def parent(self, index): return index // 2 if index > 1 else None # 示例:构建7节点的完全二叉树 tree = ArrayBinaryTree(['A','B','C','D','E','F','G']) ``` #### 3. 特性验证 - **完全性检查**:数组中不存在空洞(除末尾外) - **父子关系验证**:通过索引计算验证子节点位置 - **层次遍历**:直接读取数组即得层序遍历结果 #### 4. 复杂度分析 | 操作 | 时间复杂度 | 空间复杂度 | |------------|------------|------------| | 构建 | $O(n)$ | $O(n)$ | | 查找父节点 | $O(1)$ | - | | 查找子节点 | $O(1)$ | - | #### 5. 应用场景 - **堆结构**:优先队列的实现基础[^1] - **静态存储**:不需要频繁修改的结构 - **空间优化场景**:相比链式存储节省指针空间 #### 6. 实现要点 - **索引计算**:必须处理边界条件(如子节点超出数组长度) - **空值处理**:数组未使用位置可填充特殊标记(如None) - **动态扩展**:若需要支持动态插入,需重新分配数组(效率较低) > 引用说明:该方法利用了完全二叉树的层序填充特性,通过数学关系直接计算节点位置[^3]。当处理非完全二叉树时,需要使用特殊标记表示空节点。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值