顺序存储二叉树
1. 介绍
- 从数据存储来看,数组的存储方式和树的存储方式是可以互相转换的,即数组可以转换成树,树也可以转换成数组;
- 遍历数组arr时,仍然可以以前序遍历、中序遍历、后序遍历的方式得到二叉树。
2. 顺序存储二叉树的特点
- 顺序存储二叉树通常只考虑完全二叉树;
- 下标为i的元素的左子节点为:2 × i + 1;
- 下标为i的元素的右子节点为:2 × i + 2;
- 下标为i的元素的父节点为:(n - 1) / 2
3. 代码实现顺序存储二叉树的前、中、后序遍历
package com.datastructure;
import java.util.ArrayList;
import java.util.List;
public class ArrayBinaryTreeDemo {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(arr);
System.out.println("前序遍历:");
System.out.println(arrayBinaryTree.preorderTraversal());
System.out.println("中序遍历:");
System.out.println(arrayBinaryTree.inorderTraversal());
System.out.println("后序遍历:");
System.out.println(arrayBinaryTree.postorderTraversal());
}
}
class ArrayBinaryTree {
private int[] arr;
public ArrayBinaryTree(int[] arr) {
this.arr = arr;
}
public List<Integer> preorderTraversal() {
if (arr.length == 0) {
System.out.println("数组为空,无法遍历二叉树!");
return new ArrayList<>();
}
List<Integer> resList = new ArrayList<>();
preorderTraversal(0, resList);
return resList;
}
public List<Integer> inorderTraversal() {
if (arr.length == 0) {
System.out.println("数组为空,无法遍历二叉树!");
return new ArrayList<>();
}
List<Integer> resList = new ArrayList<>();
inorderTraversal(0, resList);
return resList;
}
public List<Integer> postorderTraversal() {
if (arr.length == 0) {
System.out.println("数组为空,无法遍历二叉树!");
return new ArrayList<>();
}
List<Integer> resList = new ArrayList<>();
postinorderTraversal(0, resList);
return resList;
}
public List<Integer> preorderTraversal(int index, List<Integer> list) {
list.add(arr[index]);
if (2 * index + 1 < arr.length) {
list = preorderTraversal(2 * index + 1, list);
}
if (2 * index + 2 < arr.length) {
list = preorderTraversal(2 * index + 2, list);
}
return list;
}
public List<Integer> inorderTraversal(int index, List<Integer> list) {
if (2 * index + 1 < arr.length) {
list = inorderTraversal(2 * index + 1, list);
}
list.add(arr[index]);
if (2 * index + 2 < arr.length) {
list = inorderTraversal(2 * index + 2, list);
}
return list;
}
public List<Integer> postinorderTraversal(int index, List<Integer> list) {
if (2 * index + 1 < arr.length) {
list = postinorderTraversal(2 * index + 1, list);
}
if (2 * index + 2 < arr.length) {
list = postinorderTraversal(2 * index + 2, list);
}
list.add(arr[index]);
return list;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律