第一行一个整数 n,表示二叉树的大小。
第二行 n 个整数 a_i,表示二叉树的先序遍历数组。
第三行 n 个整数 b_i,表示二叉树的中序遍历数组。
输出一行 n 个整数表示二叉树的后序遍历数组。
3 1 2 3 2 1 3
2 3 1
数据保证合法
import java.util.*; public class Main { int index = 0; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] pre = new int[n]; int[] in = new int[n]; int[] end = new int[n]; //map存储中序遍历中各结点对应的索引 Map<Integer,Integer> map = new HashMap<>(); for(int i=0; i<n; i++) pre[i] = scanner.nextInt(); for(int i=0; i<n; i++){ in[i] = scanner.nextInt(); map.put(in[i], i); } //先将根结点放到最末尾,因为递归遍历左右子树完成后会把根节点返回 //故在此先将根节点放到正确位置 end[n-1] = pre[0]; //递归遍历左右子树 new Main().endOrder(pre, 0, n-1, in, 0, n-1, end, map); //打印后序遍历结果 for(int x : end) System.out.print(x+" "); } public int endOrder(int[] pre, int preStart, int preEnd, int[] in, int inStart, int inEnd, int[] end, Map<Integer,Integer> map){ if(preStart > preEnd) return 0; //节点只有1个直接返回 if(preStart == preEnd) return pre[preStart]; //获取前序遍历开始点在中序遍历中的索引 int k = map.get(pre[preStart]); //左子树长度 int length = k - inStart; //递归遍历左子树 int left = endOrder(pre, preStart+1, preStart+length, in, inStart, k-1, end, map); //left不为空即左子树不为空 if(left != 0) end[index++] = left; //递归遍历右子树 int right = endOrder(pre, preStart+length+1, preEnd, in, k+1, inEnd, end, map); //right不为空即右子树不为空 if(right != 0) end[index++] = right; //遍历结束左右子树后返回根节点 return pre[preStart]; } }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.Arrays; import java.util.Stack; class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int val) { this.val = val; } } public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); String[] params = br.readLine().split(" "); int[] preOrder = new int[n]; for(int i = 0; i < n; i++) preOrder[i] = Integer.parseInt(params[i]); params = br.readLine().split(" "); int[] inOrder = new int[n]; for(int i = 0; i < n; i++) inOrder[i] = Integer.parseInt(params[i]); // 重建二叉树 TreeNode root = buildTree(preOrder, inOrder); // 后续遍历 Stack<TreeNode> stack1 = new Stack<>(); Stack<TreeNode> stack2 = new Stack<>(); stack1.push(root); while(!stack1.isEmpty()){ TreeNode node = stack1.pop(); stack2.push(node); if(node.left != null) stack1.push(node.left); if(node.right != null) stack1.push(node.right); } while(!stack2.isEmpty()) System.out.print(stack2.pop().val + " "); } private static TreeNode buildTree(int[] preOrder, int[] inOrder) { if(preOrder.length != inOrder.length || preOrder.length == 0) return null; if(preOrder.length == 1){ return new TreeNode(preOrder[0]); }else{ int rootVal = preOrder[0]; TreeNode root = new TreeNode(rootVal); int idx = indexOf(inOrder, rootVal); root.left = buildTree(Arrays.copyOfRange(preOrder, 1, 1 + idx), Arrays.copyOfRange(inOrder, 0, idx)); root.right = buildTree(Arrays.copyOfRange(preOrder, 1 + idx, preOrder.length), Arrays.copyOfRange(inOrder, idx + 1, inOrder.length)); return root; } } private static int indexOf(int[] arr, int target) { int idx = -1; for(int i = 0; i < arr.length; i++){ if(arr[i] == target){ idx = i; break; } } return idx; } }
import java.util.*; public class Main { static int[] preArr; static int[] inArr; static int[] arr; static Map<Integer, Integer> map; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); preArr = new int[n]; inArr = new int[n]; for(int i=0;i<n;i++){ preArr[i] = scanner.nextInt(); } map = new HashMap<Integer, Integer>(); for(int i=0;i<n;i++){ inArr[i] = scanner.nextInt(); map.put(inArr[i], i); } arr = new int[n]; setArr(0, n-1, 0, n-1, n-1); for(int i=0;i<n;i++) { System.out.print(arr[i]+" "); } } static int setArr(int preStart,int preEnd,int inStart,int inEnd,int postIndex) { if(preStart>preEnd) return postIndex; arr[postIndex--] = preArr[preStart]; int index = map.get(preArr[preStart]); postIndex = setArr(index - inStart + preStart +1 , preEnd, index+1,inEnd,postIndex); return setArr(preStart+1,index - inStart + preStart ,inStart,index-1 ,postIndex); } }