EOJ 3348 树的顺序存储结构
前面介绍了树的链式存储结构,那么如何用顺序存储来存储一棵树呢?在顺序存储时,我们除了存储每个结点值外,还要存储树中结点与结点之间的逻辑关系(即双亲与孩子结点之间的关系)。下面介绍树的双亲存储法。
- 编号,从根结点(它的编号为 0)开始,按从上到下的层次顺序,每一层按从左到右的顺序,递增地依次给每一个结点一个编号,图1上标出了各个结点的编号。
 - 存储,如果用一维数组 
tree[n]来存储图1中的这棵树,则树中每个结点存储在tree[n]中的下标等于它的编号值,而且在数组tree[n]中, 每个元素是一个结构体,它包含两个成员,data和parent:其中tree[i].data存储一个结点的值,tree[i].parent存储该结点的双亲结点在该数组中的下标。根结点tree[O].parent=-1, 图2为图1中树的存储数组。 


现在给出一棵树的顺序存储结构,打印树的后序遍历。
Input
第一行一个整数 n (1≤n≤100 000),表示有 n 个节点,节点的编号从 0 到 n−1。
接下来一行 n 个整数,依次表示每个节点的双亲 (tree[i].parent)。数据保证合法,能构成一棵树,并且 tree[0].parent=-1。
Output
输出树的后序遍历。
注意:如果有两个节点拥有相同的双亲节点,应该先遍历节点编号较大的那一个。
Examples
10
-1 0 0 0 1 1 1 3 3 8
9 8 7 3 2 6 5 4 1 0
#include <bits/stdc++.h>
#define CAP 100001
using namespace std;
vector<int> v[CAP];bool cmp(int i,int j){return i>j;};
void print(int pos)
{
if(v[pos].size()==) return;
sort(v[pos].begin(), v[pos].end(),cmp);
for(int x:v[pos]){
print(x);
printf("%d ",x);
}
}
int main()
{
scanf("%d",&n);int n,bac;
for(int i=,tmp;i<n;i++){
scanf("%d",&tmp);
if(tmp==-) bac=i;
else
v[tmp].push_back(i);
}
print();
printf("%d",bac);
return ;
}
vector数组每个单元保存了元素x所有子节点(如果有的话),且将其从大到小排列(题意要求从编号最大的输出)
且一旦有子节点,继续寻找子节点是否有子节点,直到没有子节点时,开始输出。
用dfs遍历解决。
EOJ 3348 树的顺序存储结构的更多相关文章
- 【PHP数据结构】完全二叉树、线索二叉树及树的顺序存储结构
		
在上篇文章中,我们学习了二叉树的基本链式结构以及建树和遍历相关的操作.今天我们学习的则是一些二叉树相关的概念以及二叉树的一种变形形式. 完全二叉树 什么叫完全二叉树呢?在说到完全二叉树之前,我们先说另 ...
 - ※数据结构※→☆非线性结构(tree)☆============二叉树 顺序存储结构(tree binary sequence)(十九)
		
二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是 ...
 - C#数据结构-二叉树-顺序存储结构
		
什么是二叉树:每个树的节点只有两个子树的树形结构. 为什么使用顺序存储结构:使用数组存放满二叉树的各结点非常方便,可以根据一个结点的索引号很容易地推算出它的双亲.孩子.兄弟等结点的编号,从而对这些结点 ...
 - 大话数据结构(五)(java程序)——顺序存储结构的插入与删除
		
获得元素操作 对于线性表的顺序存储结构来说,我们要实现getElement操作,即将线性表的第i个位置元素返回即可 插入操作 插入算法思路: 1.如果插入位置不合理,抛出异常 2.如果插入表的长度大于 ...
 - 2.2_线性表的顺序存储结构_参考集合ArrayList
		
[线性表的顺序存储从结构] 指的是用一段连续的存储单元一次储存线性表的数据元素. [线性表的顺序存储的结构代码 C语言版] #define MAXSIZE 20 /*存储空间初始分配量*/ typed ...
 - 线性表之顺序存储结构(C语言动态数组实现)
		
线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...
 - 线性表的顺序存储结构——java
		
线性表的顺序存储结构:是指用一组地址连续的存储单元一次存放线性表的元素.为了使用顺序结构实现线性表,程序通常会采用数组来保存线性中的元素,是一种随机存储的数据结构,适合随机访问.java中ArrayL ...
 - [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)
		
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...
 - [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
		
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...
 
随机推荐
- windows下查看端口进程占用情况
			
引用:http://jingyan.baidu.com/article/3c48dd34491d47e10be358b8.html 我们在启动应用的时候经常发现我们需要使用的端口被别的程序占用,但是我 ...
 - OC对象的本质及分类
			
Object-C的底层都是通过C/C++来实现的,所以OC中的对象也会转化成C/C++中的某一个数据结构, 我们在终端里通过指令 xcrun -sdk iphoneos clang -arch arm ...
 - dubbo之负载均衡
			
在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用. Random LoadBalance 随机,按权重设置随机概率. 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按 ...
 - JDK8新特性 -- Function接口: apply,andThen,compose
			
1 Function<T, R>中的T, R表示接口输入.输出的数据类型. R apply(T t) apply: .例子:func是定义好的Function接口类型的变量,他的输入.输出 ...
 - 【转载】java读取.properties配置文件的几种方法
			
读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...
 - STM32F103 rtthread工程构建
			
目录 STM32F103 工程构建 1.基本情况 2.硬件连接 3.rtthread配置 4.点灯 5. 码云上git操作 STM32F103 工程构建 1.基本情况 RAM 20K ROM 64K ...
 - eas之控制kdtable滚动条
			
//滚动条支持三种状态 自动 隐藏 显示 public static final int SCROLL_STATE_AUTO=0://自动根据数据判断是否显示或隐藏 public static fin ...
 - supervisor---elasticsearch 采坑回顾
			
supervisor 是一个可以管理进程的软件,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervi ...
 - 将现有硬盘(分区)无损创建为RAID1
			
背景 如果现在有一块硬盘(分区)正在使用,如果要设置成RAID1,并不需要将数据拷出,然后创建RAID1. 可以先将此硬盘设置成降级RAID1,然后添加新硬盘再激活RAID1即可,整个过程数据无损. ...
 - Codeforces 805A/B/C
			
A. Fake NP 传送门:http://codeforces.com/contest/805/problem/A 本题是一个数学问题. 给定两个正整数l,r(l≤r),对于区间[l..r]上的任一 ...