DS二叉树——二叉树之数组存储
题目描述
二叉树可以采用数组的方法进行存储,把数组中的数据依次自上而下,自左至右存储到二叉树结点中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点就在数组中用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二叉树——二叉树之数组存储的更多相关文章
- DS二叉树--二叉树之数组存储
		
二叉树可以采用数组的方法进行存储,把数组中的数据依次自上而下,自左至右存储到二叉树结点中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点就在数组中用0来表示.,如下图所示 从上图可以看出,右边的是 ...
 - javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作
		
树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分 ...
 - 从零自学Java-7.使用数组存储信息
		
1.创建数组: 2.设置数组的大小: 3.为数组元素赋值: 4.修改数组中的信息: 5.创建多维数组: 6.数组排序. 程序SpaceRemover:显示输入字符串,并将其中所有的空格字符替换为句点字 ...
 - Java修炼——对象数组存储表格数据
		
数组存基本数据类型,也可以存引用数据类型 对象数组:使用数组存储对象(自定义对象) 先定义Person的三个私有变量,给他取值赋值方法,重写toString方法. package com.bjsxt. ...
 - sql server数据库如何存储数组,int[]float[]double[]数组存储到数据库方法
		
原文地址:https://www.zhaimaojun.top/Note/5475296 将数组存储到数据库的方法 (本人平时同csharp编写代码,所以本文中代码都是csharp代码,有些地方jav ...
 - DS二叉树--二叉树之父子结点
		
题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构. 编写程序输出该树的所有叶子结点和它们的父亲结点 输入 第一 ...
 - DS二叉树--二叉树构建与遍历
		
题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历.中序遍历和后序遍历结果 输入 第一 ...
 - Tido 习题-二叉树-树状数组求逆序对
		
这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述 样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示 #include<iostream ...
 - Tido 习题-二叉树-树状数组实现
		
题目描述 这就是一个简单的树状数组入门题 可以动态地进行区间和查询 随时可能会进行更新 #include<iostream> #include<cstdio> #inclu ...
 
随机推荐
- AGC007E Shik and Travel 解题报告
			
AGC007E Shik and Travel 题目大意:\(n\) 个点的二叉树,每个点要么两个儿子,要么没有儿子,每条边有边权. 你从 \(1\) 号节点出发,走到一个叶子节点.然后每一天,你可以 ...
 - CF1625D - Binary Spiders[trie树优化dp]
			
官方题解 题意:给数列a[],选择尽量多的数满足任意两个异或起来<=k 1625D - Binary Spiders 思路:首先,将数列排序得到,然后升序取得的值的任意两个最小值为相邻两个异或的 ...
 - BSP-充电名词解释
			
充电名词解释 A~G H~N O~T U~Z A~G ACA = accessory charger adapter = 辅助充电适配器 ACC = apparent charge capacity ...
 - rabbitMq急速安装教程
			
背景 我们在工作中很多时候其实也用过mq.但是仅仅只是会用,所以老猫在此想完整地归纳一下mq相关的知识点,在此分享给大家.首先给大家带来的是mq的单机急速安装.操作系统时centos7.(本来想记录到 ...
 - 物联网无线数传应用中的Modbus通信网关协议到底是什么?
			
什么是物联网 通信Modbus网关 Modbus协议无线通信网关就是将一种Modbus协议帧转换为其他物联网无线数传协议帧. 比如将Modbus RTU的数据与Modbus TCP数据进行相互转换:也 ...
 - Java-调用R语言和调用Python(前后端展示)
			
1. 背景 R语言和Python用于数据分析和数据处理,并生成相应的直方图和散点图 需要实现一个展示平台,后端使用Java,分别调用R语言和调用Python,并返回数据和图给前端显示 这个平台主要实现 ...
 - VR技术赋能五大领域,不止高级,更高效!
			
除了VR游戏.VR影视作品,究竟还有哪些产业领域会应用到VR技术并为生活带来改变呢?今天就帮大家好好梳理一下~ VR赋能交通,不只是高级 最近在网上看到了VR考驾照的新闻,网友都赞叹,现在学车都这么高 ...
 - 使用html2canvas,由html转换canvas时,出现图片丢失问题解决方案
			
在img标签上加上crossorigin="anonymous":如果是图片地址是跨域网址,请将图片转换为base64格式: 源码如下: <!DOCTYPE html> ...
 - Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍
			
大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第三篇了,先来回顾下前面两篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...
 - Python列表解析式的正确使用方式(一)
			
先来逼逼两句: Python 是一种极其多样化和强大的编程语言!当需要解决一个问题时,它有着不同的方法.在本文中,将会展示列表解析式 (List Comprehension).我们将讨论如何使用它?什 ...