题目描述

二叉树可以采用数组的方法进行存储,把数组中的数据依次自上而下,自左至右存储到二叉树结点中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点就在数组中用0来表示。,如下图所示

从上图可以看出,右边的是一颗普通的二叉树,当它与左边的完全二叉树对比,发现它比完全二叉树少了第5号结点,所以在数组中用0表示,同样它还少了完全二叉树中的第10、11号结点,所以在数组中也用0表示。

结点存储的数据均为非负整数

输入

第一行输入一个整数t,表示有t个二叉树

第二行起,每行输入一个数组,先输入数组长度,再输入数组内数据,每个数据之间用空格隔开,输入的数据都是非负整数

连续输入t行

输出

每行输出一个示例的先序遍历结果,每个结点之间用空格隔开

样例输入

3

3 1 2 3

5 1 2 3 0 4

13 1 2 3 4 0 5 6 7 8 0 0 9 10

样例输出

1 2 3

1 2 4 3

1 2 4 7 8 3 5 9 10 6

提示

注意从数组位置和二叉树深度、结点位置进行关联,或者父子结点在数组中的位置存在某种管理,例如i, i+1, i/2, i+1/2........或者2i, 2i+1.......仔细观察哦

思路

这道题我做了很久,用了笨办法,就是先输出左边再输出右边,单纯记录一下代码。

#include<iostream>
#include<math.h>
using namespace std; int getLayer(int n) {
int j = 0;
while (n / 2 != 0) {
j++;
n = n / 2;
}
return j;
} int main() {
int t;
cin >> t;
while (t--) {
int len;
cin >> len;
int* num = new int[len];
for (int i = 0; i < len; i++) {
cin >> num[i];
}
int layer = getLayer(len);
int x, n, j = 0;
cout << num[0] << ' ';
for (int i = 1; i <= layer; i++) {
n = pow(2, i);
if (num[n - 1]) {
cout << num[n - 1] << ' ';
num[n - 1] = 0;
}
}
if (num[n] && n != 2)
cout << num[n] << ' ';
if (layer > 2) {
for (int i = 2; i <= layer; i++) {
n = pow(2, i);
x = pow(2, i - 1);
int j = n + pow(2, i - 2);
while (j <= n + x - 1) {
if (num[j - 1]) {
cout << num[j - 1] << ' ';
num[j - 1] = 0;
}
j++;
}
}
}
for (int i = 1; i <= layer; i++) {
n = pow(2, i);
x = pow(2, i - 1);
if (num[n + x - 1] > 0 && (n + x - 1) < len) {
cout << num[n + x - 1] << ' ';
num[n + x - 1] = 0;
}
}
if (num[n + x] > 0 && (n + x) < len)
cout << num[n + x] << ' ';
if (layer > 2) {
for (int i = 2; i <= layer; i++) {
n = pow(2, i);
int j = 2 * n - pow(2, i - 2);
while (j <= 2 * n - 1 && (2 * n - 1) < len) {
if (num[j - 1] > 0) {
cout << num[j - 1] << ' ';
num[j - 1] = 0;
}
j++;
}
}
}
cout << endl;
}
return 0;
}

DS二叉树——二叉树之数组存储的更多相关文章

  1. DS二叉树--二叉树之数组存储

    二叉树可以采用数组的方法进行存储,把数组中的数据依次自上而下,自左至右存储到二叉树结点中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点就在数组中用0来表示.,如下图所示 从上图可以看出,右边的是 ...

  2. javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作

    树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分 ...

  3. 从零自学Java-7.使用数组存储信息

    1.创建数组: 2.设置数组的大小: 3.为数组元素赋值: 4.修改数组中的信息: 5.创建多维数组: 6.数组排序. 程序SpaceRemover:显示输入字符串,并将其中所有的空格字符替换为句点字 ...

  4. Java修炼——对象数组存储表格数据

    数组存基本数据类型,也可以存引用数据类型 对象数组:使用数组存储对象(自定义对象) 先定义Person的三个私有变量,给他取值赋值方法,重写toString方法. package com.bjsxt. ...

  5. sql server数据库如何存储数组,int[]float[]double[]数组存储到数据库方法

    原文地址:https://www.zhaimaojun.top/Note/5475296 将数组存储到数据库的方法 (本人平时同csharp编写代码,所以本文中代码都是csharp代码,有些地方jav ...

  6. DS二叉树--二叉树之父子结点

    题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构. 编写程序输出该树的所有叶子结点和它们的父亲结点 输入 第一 ...

  7. DS二叉树--二叉树构建与遍历

    题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历.中序遍历和后序遍历结果 输入 第一 ...

  8. Tido 习题-二叉树-树状数组求逆序对

    这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述   样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示     #include<iostream ...

  9. Tido 习题-二叉树-树状数组实现

    题目描述 这就是一个简单的树状数组入门题 可以动态地进行区间和查询 随时可能会进行更新   #include<iostream> #include<cstdio> #inclu ...

随机推荐

  1. [算法学习] 换根dp

    换根dp 一般来说,我们做题的树都是默认 \(1\) 为根的.但是有些题目需要计算以每个节点为根时的内容. 朴素的暴力:以每个点 \(u\) 作为 \(root\) 暴力dfs下去,复杂度\(O(n^ ...

  2. java面试:关于public static void main(String[] args)是什么意思?

    它是作为JAVA中的主函数,所有java程序的运行起点就是这个方法,除了args这个名字可以不一样外,其他必须是这样. 主函数的一般写法如下: public static void main(Stri ...

  3. 【SpringSecurity系列1】基于SpringSecurity实现前后端分离无状态Rest API的权限控制

    源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/01-springsecurity-state ...

  4. flowable与camunda性能测试对比分析

    前言 目前主流的Java开源流程引擎有Activiti.Flowable.Camunda,笔者在进行流程引擎技术选型时,除了功能方面,性能和稳定性是尤其关注的指标,是选择Flowable?还是Camu ...

  5. 基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  6. Idea创建文件夹自动合成一个

    在idea中创建文件夹时,它们总是自动合成一个,如下图: 文件夹自动折叠真的很影响效率,可能会引发一些不经意的失误 解决方法: 取消这个地方的勾选 这样就可以正常创建文件夹了

  7. js 表面学习 - 认识函数

    JavaScript 函数语法 JavaScript 函数通过 function 关键词进行定义,其后是函数名和括号 (). 函数名可包含字母.数字.下划线和美元符号(规则与变量名相同). 圆括号可包 ...

  8. 【黑马pink老师的H5/CSS课程】(二)标签与语法

    视频链接:P8~P29 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动 参考链接: HTML 元素 1.HTML语法规范 1.1 基本语法概述 HTML 标签是由尖 ...

  9. python小题目练习(八)

    题目:电视剧的收视率排行榜 需求:实现如下图所示需求  代码展示: """Author:mllContent:电视剧的收视率排行榜Date:2020-11-16" ...

  10. 如何用空气质量查询API接口进行快速开发

      空气质量的好坏反映了空气污染程度,它是依据空气中污染物浓度的高低来判断的.空气污染是一个复杂的现象,在特定时间和地点空气污染物浓度受到许多因素影响.来自固定和流动污染物的人为污染物排放大小是影响空 ...