当前位置: 首页 > article >正文

37. 数组二叉树

一、题目描述
二叉树只也可以用数组来存储,给定一个数组,树的根节点的值储存在下标1,对于储存在下标n的节点,他的左子节点和右子节点分别储存在下标2n和2n+1,并且我们用-1代表一个节点为空,给定一个数组存储的二叉树,试求从根节点到最小的 叶子节点只的路径,路径由节点的值组成。

二、输入描述
输入一行为数组的内容,数组的每个元素都是正整数,元素间用空格分割,注意第一个元素即为根节点的值,即数组的第n元素对应下标n,下标0在树的表示中没有使用,所以我们省略了,输入的树最多为7层。

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

示例 1
输入:

3 5 7 -1 -1 2 4

输出:

3 7 2

示例 2
输入:

5 9 8 -1 -1 7 -1 -1 -1 -1 -1 6

输出:

5 8 7 6
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/lbp0123456/article/details/143730774

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.二叉树也可以用数组来存储,

2.给定一个数组,树的根节点的值储存在下标1,

3.对于储存在下标n的节点,它的左子节点和右子节点分别储存在下标2n和2n+1,

4.并且我们用-1代表一个节点为空,给定一个数组存储的二叉树

5.试求从根节点到最小的叶子节点的路径,

6.路径由节点的值组成

7.输入描述:输入一行为数组的内容,数组的每个元素都是正整数,元素间用空格分割,注意第一个元素即为根节点的值,即数组的第n元素对应下标n,下标0在树的表示中没有使用,所以我们省略了,输入的树最多为7层。

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

二、解题思路

1.

2.

3.首先理解一下题目,题目的意思是找到二叉树中最小的节点值,并且返回从根节点到达该叶子节点的路径上各个节点的值。

所以对于第一棵树,最小值是2(-1代表节点为空)我们的输出是3 7 2

第二棵树的最小值是6,所以输出是5 8 7 6

4.

对于在数组中存储的二叉树,如果树的根节点的下标为1时,树中的根节点的左子节点的下标是2n,右子节点的下标是2n+1

5.所以我们先找到最小值,找到最小值之后记录下来最小值的索引,

比如索引值是14,我们将索引值除以2,14/2=7,然后7再除以2=3,3再除以2=1

所以我们从根节点到最小值的索引分别是1 3 7 14

6.还有需要注意的是我们要找的是最小的叶子节点,所以如果是根节点不可以

关于这一点我们可以判断,如果找到的节点*2超过我们所有节点的值,那么这个节点是一个叶子节点

或者如果我们用总节点数除以2,的数字的下一个数字到最后一个节点是叶子节点。

三、具体步骤

使用的语言是C

#include <stdio.h>
#include <limits.h>
int main() {
    int arr[1000];
    arr[0] = 0;
    int idx = 1;
    int min = INT_MAX;
    int minidx = 0;
    while (scanf("%d", &arr[idx++]) != EOF) {
        // printf("输入数值%d, 索引值为%d\n", arr[idx - 1], idx - 1);
    }
    idx--;
    for(int i = 1; i < idx; i++) {
        if(arr[i] != -1) {
            if(arr[i] < min) {
                if(((i * 2) > idx)) {
                    min = arr[i];
                    minidx = i;
                    // printf("最小值更新为%d, 索引值为%d\n", min, minidx);
                }
            }
        }
    }




    int answer[idx];
    int aidx = 0;
    while (minidx != 1) {
        // printf("当前节点为%d值为%d\n", minidx, arr[minidx]);
        answer[aidx++] = minidx;
        minidx /= 2;
    }
    printf("%d", arr[1]);
    for (int i = aidx - 1; i >= 0; i--) {
        printf(" %d", arr[answer[i]]);
    }
    return 0;
}


http://www.kler.cn/a/466468.html

相关文章:

  • 模型 九屏幕分析法
  • Uniapp Android 本地离线打包(详细流程)
  • react 优化方案
  • Tailwind CSS 使用简介
  • 【网络安全 | 漏洞挖掘】绕过电子邮件确认实现预账户接管
  • 一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理
  • NanoEdge AI Studio入门
  • React-Router 一站式攻略:从入门到精通,掌握路由搭建与权限管控
  • QT------------其他工具软件和技术
  • pcl源码分析之计算凸包
  • 设计模式之访问者模式:一楼千面 各有玄机
  • 养老院小程序怎么搭建?让老年人老有所养,老有所依!
  • 数据挖掘——关联规则挖掘
  • 如何进一步提高Oracle lgwr的写性能?
  • R机器学习:神经网络算法的理解与实操,实例解析
  • eplan如何导出可跳转的PDF
  • 【Rust练习】26.Package and Crate
  • 深入理解 Java Set 集合:原理、应用与高频面试题解析
  • 图片转三维模型网站(免费),AI建模,一键把图片转三维模型,二维图片转3维模型,AI建模
  • 用python编写一个放烟花的小程序
  • 机器学习笔记——正则化
  • Entity Framework Core介绍
  • React第二十一章(useCallback)
  • Kafka 快速实战及基本原理详解解析-01
  • Ubuntu Server安装谷歌浏览器
  • 多模态论文笔记——Coca