系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、java代码
- 五、测试用例
前言
本人最近再练习算法,所以会发布一些解题思路,希望大家多指教
一、题目描述
二叉树也可以用数组来存储,给定一个数组,树的根节点的值存储在下标1,对于存储在下标N的节点,他的左子节点和右子节点分别存储在下标2N和2N+1,并且我们用值-1代表一个节点为空。
给定一个数组存储的二叉树,试求从根节点到最小的叶子节点的路径,路径由节点的值组成。
二、输入描述
输入一行为数组的内容,数组的每个元素都是正整数,元素间用空格分割。
注意第一个元素即为根节点的值,即数组的第N个元素对应下标N,下标0在树的表示中没有使用,所以我们省略了。
输入的树最多为7层。
三、输出描述
输出从根节点到最小叶子节点的路径上,各个节点的值,由空格分割,用例保证最小叶子节点只有一个。
四、java代码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//获取存放二叉树信息的数组
int[] array = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int n = array.length;
//初始化最小叶子结点的值
int min = Integer.MAX_VALUE;
//初始化最小叶子结点的下标
int min_index = -1;
for (int i = 0; i < n; i++) {
if(array[i] != -1){
//跳过非叶子结点
if((i+1)*2-1 < n && array[(i+1)*2 -1] != -1) continue;
if((i+1)*2 < n && array[(i+1)*2] != -1) continue;
//通过比较获取最小叶子结点
if(min > array[i]){
min_index = i;
min = array[i];
}
}
}
//存放最小叶子结点到根路径的所有节点
List<Integer> list = new ArrayList<>();
list.add(min);
//通过当前节点下标计算上一个父节点的下标
int temp = min_index;
while (temp > 0){
temp = (temp - 1)/2;
list.add(array[temp]);
}
//倒序输出根节点到最小叶子结点的路径
for (int i = list.size() -1; i >=0 ; i--) {
System.out.print(list.get(i)+" ");
}
}
五、测试用例
输入:
2 5 8 6 4 3 -1 9 -1 11 13
输出: