Генерация обхода после заказа с учетом обхода по порядку и по предварительному заказу - PullRequest
0 голосов
/ 12 марта 2012

Я вижу, что код размещен здесь: Как вывести обход дерева по предварительному заказу с учетом трансверса по порядку и после заказа?

У меня проблемы с пониманием логики, хотя, особенно, рекурсия для правой части дерева:

postorder(preorder, prestart+i-inostart+1, inorder, i+1, length-i+inostart-1);

Любая помощь будет оценена.

1 Ответ

3 голосов
/ 18 марта 2012

предположим, что дерево двоичных выражений и как на него действуют обходы порядка, порядка и пост-порядка:

  1. inorder: левое поддерево, текущий корень, правое поддерево
  2. preorder: текущий корень, левое поддерево, правое поддерево
  3. postorder: левое поддерево, правое поддерево, текущий корень

теперь текущий код, сначала идентифицирующийлевое и правое поддеревья.как мы знаем, первый элемент массива preorder это наш корень, и мы могли бы найти наш соответствующий корень в массиве inorder.поскольку мы знаем, что все элементы до корня являются элементами левого поддерева, а все элементы после него являются элементами правого поддерева.

мы хотим произвести обход по порядку, поэтому рекурсивно продолжаем работу с левым поддеревом:

   postorder(preorder, prestart+1, inorder, inostart, i-inostart);
  1. prestart + 1: , поскольку корень левого поддерева находится сразу после текущего корня в обходе предварительного заказа
  2. i-inostart: , поскольку i является индексом нашего корня в массиве inorder, поэтому i-inostart будет размером левого поддерева

затемправое поддерево:

   postorder(preorder, prestart+i-inostart+1, inorder, i+1, length-i+inostart-1);
  1. предварительный запуск + i-inostart + 1: , как я уже говорил выше i-inostart - размер левогоподдерево, а также мы знаем, что в массиве предварительного заказа корень правого поддерева будет идти после текущего корня и всего поддерева, поэтому его индекс будет prestart + i-inostart + 1
  2. i + 1: , поскольку в массиве inorder индекс корня был i , а элементпосле этого должно быть начало правого поддерева в массиве перестановок
  3. length-i + inostart-1: , поскольку размер правого поддерева будет длина минус размер левого поддерева и минус 1 (корень)

, а затем выведите наш текущий корень:

   cout<<preorder[prestart]<<" ";

рекурсивное выполнение приведет кв обход заказа дерева.

...