Я решал этот вопрос - Найти обход PostOrder из обходов Inorder и Preorder бинарного дерева. На GeeksForGeeks я видел следующее решение для этого:
// A utility function to search x in arr[] of size n
static int search(int arr[], int x, int n)
{
for (int i = 0; i < n; i++)
if (arr[i] == x)
return i;
return -1;
}
// Prints postorder traversal from given inorder and preorder traversals
static void printPostOrder(int in1[], int pre[], int n)
{
// The first element in pre[] is always root, search it in in[] to find left and right subtrees
int root = search(in1, pre[0], n);
// If left subtree is not empty, print left subtree
if (root != 0)
printPostOrder(in1, Arrays.copyOfRange(pre, 1, n), root);
// If right subtree is not empty, print right subtree
if (root != n - 1)
printPostOrder(Arrays.copyOfRange(in1, root+1, n), Arrays.copyOfRange(pre, 1+root, n), n - root - 1);
// Print root
System.out.print( pre[0] + " ");
}
Теперь я знаю, что в postorder мы посещаем узел после обхода левого и правого поддеревьев, и поэтому я мог сделать вывод из комментариев в методе printPostOrder (), что сначала что-то делается с левым поддеревом, затем с правым, а затем с узлом данные печатаются. Я рисую несколько начальных рекурсивных вызовов на бумаге, и все работает нормально, но я просто не могу понять, как кто-то может придумать это решение? Меня особенно смущает утверждение, вызывающее printPostOrder для правого поддерева. Может ли кто-нибудь помочь мне понять, в чем заключается логика рекурсии и как я могу ее понять, правильно визуализировав?