系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、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
输出: