/** * 审题:(这个题真的看了好多遍才明白) * 一共三个数组,最后一个数组是指定的结点,前两个数组一个表示左子树,一个表示右子树,怎么看呢?(重点!) * 根结点的值是1,所以,要找左子树,[1-1]得到下标0, * 在左子树的数组找1的左儿子,如示例1,对应的左儿子是4, * 在右子树的数组找1的右儿子,如示例1,对应的右儿子是2, * 如果左儿子的值不为0,[左儿子-1]得到下标, * 如示例1,得到下标3,找到4的右儿子是5,左子树数组对应的值是0,所以没有左儿子 * 如果右儿子的值不为0,[右儿子-1]得到下标, * 如示例1,得到下标1,找到2的左儿子是3,没有右儿子 * 继续寻找... * 如示例1,得到二叉树 * 1 * 4 2 * 5 3 * 大体思路:读题,需要两个功能:旋转,中序遍历 * 中序遍历时,需要额外注意一点,要定义一个静态变量用来控制存储数组的下标, * 如果想要将值带在参数传过去,会出现错误,因为左子树和右子树参数不通 * 旋转时一定要注意if的使用,否则会出现数组下标越界错误 */ public static int cur = 0; public int[] solve(int n, int m, int[] l, int[] r, int[] k) { for (int i : k) { treeSwap(l, r, i - 1); } int[] result = new int[n]; inOrder(result, l, r, 1); return result; } // 旋转 public void treeSwap(int[] l, int[] r,int index) { if (l[index] == 0&& r[index] == 0) { return; } int temp = l[index]; l[index] = r[index]; r[index] = temp; if (l[index] != 0) { treeSwap(l, r, l[index] - 1); } if (r[index] != 0) { treeSwap(l, r, r[index] - 1); } } // 中序遍历 public void inOrder(int[] result, int[] l, int[] r, int temp) { if (l[temp - 1] != 0) { inOrder(result, l, r, l[temp - 1]); } result[cur++] = temp; if (r[temp - 1] != 0) { inOrder(result, l, r, r[temp - 1]); } }