数组二叉树-华为OD

系列文章目录

文章目录

前言

本人最近再练习算法,所以会发布一些解题思路,希望大家多指教

一、题目描述

二叉树也可以用数组来存储,给定一个数组,树的根节点的值存储在下标1,对于存储在下标N的节点,他的左子节点和右子节点分别存储在下标2N和2N+1,并且我们用值-1代表一个节点为空。

给定一个数组存储的二叉树,试求从根节点到最小的叶子节点的路径,路径由节点的值组成。

二、输入描述

输入一行为数组的内容,数组的每个元素都是正整数,元素间用空格分割。

注意第一个元素即为根节点的值,即数组的第N个元素对应下标N,下标0在树的表示中没有使用,所以我们省略了。

输入的树最多为7层。

三、输出描述

输出从根节点到最小叶子节点的路径上,各个节点的值,由空格分割,用例保证最小叶子节点只有一个。

四、java代码

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

输出:

相关推荐
2601_962071571 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491112 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
淡海水2 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan3 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy4 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息4 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
zww89491115 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
kiracrimson5 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
黑马程序员毕设6 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳6 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法