本题要求我们处理一个表示调用栈的树形结构,树的每个节点包含一个样本数量,节点间通过分隔符 -1
来标识。输入包含树的节点总数和层序遍历的序列化数据,输出需要更新每个节点的样本数量,使其等于该节点自身的样本数量加上所有子节点的样本数量之和。通过解析输入构建树,计算新样本数量后,按相同格式输出更新后的数据。
就是很简单的树的递归求和,dfs一遍即可,输入输出比较抽象注意处理
调用栈指从主函数执行到某个函数的调用路径,
如 A->B ,经过这条调用栈到达的其他调用栈称为其子调用栈,如 A->B->D 是 A->B 的子调用栈;
使用某性能分析工具对软件运行过程中的调用栈进行采样分析,得到的热点调用栈数据为树形结构。
树的每个节点代表一条调用栈,子节点为父节点的子调用栈,每个节点有一个数值为采样到该调用栈的样本数量。
现需要刷新各节点的数值为包含其子调用栈的总样本数量,请编码实现。
数的层序遍历,指的是从上到下遍历每层,每层从左到右遍历各节点;为了标识子节点关系,对于 N 个节点的树的层序遍历,插入 N 个 −1 ,第 i 个 −1 和第 i+1 个 −1 中间的节点序列为第 i 个节点的子节点序列,根节点为第 1 个节点;
第一行为树的总节点数量 N ,取值范围 [1,1000] ;
第二行为树的序列化输入,采用层序遍历,共 2N 个数据,包括 N 个节点的样本数和 N 个节点的子节点序列的分隔符(参见示例);
各节点样本数取值范围 [0,10000] ;
输出刷新各节点数值后的树,与输入格式保持一致。
输入
6
5 -1 2 3 8 -1 -1 1 7 -1 -1 -1
输出
26 -1 2 11 8 -1 -1 1 7 -1 -1 -1
说明
第一行表示树一共有 6 个节点:
第二行为按照层序遍历的序列化输入,共 12 个数据(含 6 个节点的样本数和 6 个节点的子节点序列的分隔符),含义分别为:
构造输入树形结构:
根据树形结构计算各节点包含子节点的样本数:
调用栈 A->C 有子调用栈 A->C->E 和 A->C->F ,其包含子调用栈的样本数量为 3+1+7=11;
根节点调用栈 A 包含了调用栈 A->B、A->C 和 A->D,其包含子调用栈的样本数量为 5+2+11+8=26;
刷新后的热点调用栈树:
按照层序遍历序列化输出:
26 -1 2 11 8 -1 -1 1 7 -1 -1 -1