十-2, Java实现顺序存储二叉树的遍历
10.1 顺序存储二叉树定义
从数据存储来看, 数组存储方式和树的存储方式可以相互转换, 即数组可以转换成树, 树也可以转换成数组. 顺序结构存储就是使用数组来存储, 一般使用数组只适合表示完全二叉树, 因为非完全二叉树会有空间的浪费.
- 下图是树和数组对应的关系图
用数组顺序存储二叉树, 其显著特征是: (n表示数组的索引值)
-
- 在数组中index=n的元素对应的父节点为 index=(n-1)/2的元素, 向下取整;
-
- 在数组中index=n的元素对应的左子节点为 index=2*n+1的元素;
-
- 在数组中index=n的元素对应的右子节点为 index=2*n+2的元素;
举个栗子说明一下吧, 比如上图中,数组存储二叉树, int[] arr={1,2,3,4,5,6,7},
- 对于索引值index=2的元素3, 他的
- 父节点为 arr[(index-1)/2]=arr[0]=1,
- 左子节点为 arr[2*index+1]=arr[5]=6,
- 右子节点为 arr[2*index+2]=arr[6]=7;
10.2 顺序存储二叉树遍历的实现
【案例需求】
已知一个数组为:
arr = {1,2,3,4,5,6,7}
要求以二叉树前序遍历的方式对数组进行遍历,前序遍历的结果应当为:
1,2,4,5,3,6,7
【思路分析】
这个需求实际上是在考察顺序存储二叉树的重要特征:第 n 个元素的左子节点为 2n+1、右子节点为 2n+2。
根据它的特征我们可以知道:第 0 个元素 arr[0] 的左子节点为 arr[1]、右子节点为 arr[2];第 1 个元素 arr[1] 的左子节点为 arr[3]、右子节点为 arr[4] …
【代码实现】
利用顺序存储二叉树的公式,我们可以很容易写出对数组以二叉树形式的前序遍历:
package DataStrcture.binaryTreeDemo;
public class ArrBinaryTree {
//把二叉树顺序存储到数组中
//根据二叉树结点的关系. 我们直接访问数组的元素
// 指定index的父节点索引为 (index-1)/2, 左子树结点 2*index+1, 右子树结点 2*index+2
int[] arr;
public ArrBinaryTree(int[] arr){
this.arr = arr;
}
// 通过索引访问数组来前序遍历二叉树
public void preOrder(int index){
//
System.out.print(arr[index] +", ");
//在索引不超过数组长度的情况下, 递归遍历左子树
if( index*2+1 < arr.length)
preOrder(index*2+1);
//递归遍历右子树
if( index*2+2 < arr.length)
preOrder(index*2+2);
}
//测试方法
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
ArrBinaryTree tree = new ArrBinaryTree(arr);
tree.preOrder(0);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)