# 缺损二叉树 by 庾湫镆 时间限制: 1000 ms 内存限制: 1000 KB ## 问题描述 输入给定一系列缺损点,将一棵无限深度的满二叉树进行重新编号,编号方式为从1开始逐行从左至右顺序编号,缺损点得到编号后,其子树被删去,后续编号中该子树的结点跳过不编号,编号后的树被称为“缺损二叉树”。例如下图为缺损点为{5,6,9}的缺损二叉树的一部分(下方可无限延长),红色数字标注了缺损点,其下方灰色子树被删去。对于输入给定的目标编号,输出缺损二叉树上根节点到目标结点的路径,该路径用经过的所有结点的编号表示。下图中,蓝色表示根结点到目标结点15的路径,路径用途径结点编号{1,3,7,10,15}表示。 ## 输入格式 第一行为两个整数N和M,N表示缺损点数目,M表示目标点的数目。 第二行为N个缺损点的编号,按从小到大顺序排列。 第三行为M个目标点的编号,按从小到大顺序排列。 下方给出的输入样例表示缺损点为{5,6,9},目标点为{3,9,15,22}。 ## 输出格式 每一行输出根节点到一个目标点的最短路径,路径用途径节点编号表示。 如果该路径不存在,则输出0。 共输出M行。 ## 输入样例 >3 4 > >5 6 9 > >3 9 15 22 ## 输出样例 1 3 1 2 4 9 1 3 7 10 15 1 3 7 10 14 22 ## 提示 题目假定缺损点及目标点数目不超过100个,目标节点编号均小于2^32。 对本题,可以根据题目要求逐行构造该缺损二叉树。对于当前行,记录所有非缺损点,在下一行依次构造子节点,并排除缺损点,直到构造到目标节点为止。利用构造节点时记录的父亲节点编号,可以从目标节点搜索到回到根节点的路径,将该路径翻转,即可得到所求路径。 上述方法在目标节点编号过大时会占用过多内存,事实上,若某棵子树或树中的某连续部分不存在缺损点,可以不必将其每个节点均储存在内存中。你可以自行设计省略表示方法以满足性能要求。