백준 '2236번: 트리의 순회' 문제를 처음 접하고 중위 순회 경로를 활용하여 트리를 재구축한다면 문제를 쉽게 풀 수 있을 것이라 생각했다. 그러나 중위 순회 경로만으로 트리를 재구축하기에는 치명적인 문제가 있었다.

class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public class BinaryTreeReconstruction {
public static TreeNode buildTree(int[] inorder, int[] postorder) {
if (inorder == null || postorder == null || inorder.length != postorder.length) {
return null;
}
return buildTreeHelper(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);
}
private static TreeNode buildTreeHelper(int[] inorder, int inStart, int inEnd,
int[] postorder, int postStart, int postEnd) {
if (inStart > inEnd || postStart > postEnd) {
return null;
}
int rootVal = postorder[postEnd];
TreeNode root = new TreeNode(rootVal);
int inorderIndex = 0;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == rootVal) {
inorderIndex = i;
break;
}
}
int leftSubtreeSize = inorderIndex - inStart;
root.left = buildTreeHelper(inorder, inStart, inorderIndex - 1,
postorder, postStart, postStart + leftSubtreeSize - 1);
root.right = buildTreeHelper(inorder, inorderIndex + 1, inEnd,
postorder, postStart + leftSubtreeSize, postEnd - 1);
return root;
}
public static void inorderTraversal(TreeNode root) {
if (root == null) {
return;
}
inorderTraversal(root.left);
System.out.print(root.val + " ");
inorderTraversal(root.right);
}
public static void main(String[] args) {
int[] inorder = {9, 4, 13, 1, 16, 6, 11, 2, 10, 7, 12, 3, 15, 5, 14};
int[] postorder = {9, 13, 4, 16, 11, 6, 1, 10, 12, 7, 15, 14, 5, 3, 2};
TreeNode root = buildTree(inorder, postorder);
System.out.println("중위 순회 결과로 재구축한 이진 트리:");
inorderTraversal(root);
}
}