51. 平移二叉树(第七期模拟笔试)

内存限制:128 MB 时间限制:1.500 S

题目描述

给定一棵二叉树,需要对每一层的节点执行向右循环位移操作。其中每一次向右位移一位(即 k = 1)的操作包括以下几步骤:

  1. 如果当前节点是其父节点的左子节点,将其变为其父节点的右子节点。
  2. 如果当前节点是其父节点的右子节点,将其变为其父节点右侧相邻兄弟节点的左子节点,若当前节点的父节点已经是其同级最右侧的节点,则将其变为同级最左侧节点的左子节点。
  3. 所有层次上的节点同时执行一次位移操作。
  4. 从最底层开始,逐层向上操作,直到达到根节点,完成整个过程

输入

第一行包含两个整数,分别是 k 和 N,其中 k 表示每次向右位移的位数,N 表示树的层序遍历节点的数量(包括空节点)。
第二行包含 N 个整数,树的层序遍历结构,用于描述二叉树的节点关系。

输出

输出二叉树的层序遍历结构,以表示经过位移操作后的结果。

样例输入 复制

1 17
1 2 3 4 -1 5 6 -1 7 -1 -1 8 -1 -1 -1 -1 -1

样例输出 复制

1 3 2 -1 5 6 4 7 -1 -1 8 -1 -1 -1 -1 -1 -1

提示

数据范围:
1 <= k <= 1000;
2 <= N <= 10001;

将层序遍历的数组转化为二叉树时,可以按照层序遍历的顺序逐个构建二叉树的节点之间的连接关系,其中-1表示空节点,空节点是没有左右孩子节点的。

最后一层向右平移一位。

向上一层,然后继续向右平移一位。

再向上一层,继续向右平移一位。

最终按照层序遍历的方式打印二叉树