Корисність обходу двійкових дерев перед і після замовлення


13

Це може бути дуже наївним, але мені було цікаво, це контекст бінарних дерев (звичайних, відсортованих та врівноважених) усіх типів проходу:

  • попереднє замовлення на глибину
  • глибина-перший в порядку
  • глибина першого замовлення
  • вшир

яка реальна корисність до і після замовлення? Я маю на увазі, чи є якийсь тип та / або конфігурація двійкового дерева, в якому перехід до та / або після замовлення дав би (деяку) перевагу (и) перед іншими двома?

AFAICS, є певні типи та конфігурація двійкових дерев, для яких порядок та ширина в першу чергу можуть дати певну перевагу:

  • для збалансованого бінарного дерева будь-який обхід першої глибини використовуватиме менше місця для зберігання пам’яті порівняно з шириною спочатку (наприклад, для збалансованого бінарного дерева 6 або 7 вузлів, висота 2, тому будь-який обхід першої глибини повинен зберігати максимум 2 вузли в будь-який момент часу, тоді як останній рівень має 3 або 4 вузли, тому обхід першої ширини повинен зберігати до 3 або 4 вузлів у якийсь момент). У цьому випадку за допомогою проходу в порядку використовується найменший об'єм пам'яті та відвідування вузлів у їх природному порядку.

  • для неврівноваженого бінарного дерева, якщо воно наближене до найгіршого сценарію вставки, проходження його вперше зайняло б менше пам’яті порівняно з будь-яким обходом перших глибин. Тож у цьому випадку широта-перша пропонує перевагу. Перехід на замовлення знову має перевагу відвідування цінностей у їх природному порядку.

Однак я не можу придумати ситуацію, коли до і після переходу було б перевагу над іншими.

Відповіді:


13

Вам потрібно робити різні речі з деревами, як-от перекласти між структурою даних та деяким серійним поданням, як у файлі чи мовою.

Наприклад, припустимо, у вас таке дерево розбору:

    *
   / \
  +   \
 / \   \
A   B   C

Ви можете його серіалізувати як * + A B Cшляхом переходу в префіксальному порядку, так A B + C *і в порядку постфікса. Якщо ви взагалі працюєте з мовними процесорами, такі речі потребують другого характеру.


Дуже хороший приклад! І зверніть увагу на те, як вийде перехід по порядку A + B * C, який зрозуміти нормальним користувачам набагато простіше, ніж будь-який префікс порядку постфікса.
Кіліан Фот

3
@KilianFoth, окрім цього не те, що говорить дерево - воно говорить (A + B) * C, принаймні моїм очам. Хоча мої пальці HP-28, як версія AB + C *, просто чудові. :-)
sdg

@Kilian: sdg правильно. Із порядком, ви повинні перейматися пріоритетом, якщо ви не ставите круглі дужки навколо всього.
Майк Данлаве

13

У статті у вікіпедії є чіткий короткий опис того, коли ви хочете використовувати різні типи пошуку на глибині:

  • Обхід попереднього замовлення під час дублювання вузлів та значень може зробити повний дублікат двійкового дерева. Він також може бути використаний для виготовлення префіксального вираження (польська позначення) з дерев виразів: попередньо перекреслити дерево виразів.
  • Означення замовлення дуже часто використовується на двійкових деревах пошуку, оскільки воно повертає значення з базового набору в порядку, згідно з порівняльником, який встановлює двійкове дерево пошуку (звідси і назва).
  • Обхід після замовлення під час видалення або звільнення вузлів і значень може видалити або звільнити ціле двійкове дерево. Він також може генерувати подання постфіксу бінарного дерева.

Це зводиться до логістичних потреб алгоритму. Наприклад, якщо ви не використовуєте обхід після замовлення під час видалення, ви втрачаєте посилання, необхідні для видалення дочірніх дерев.


Вікіпедія станом на 10 листопада 2019 року змінилася, і перший опис також належить до "Замовлення після замовлення", що заплутано. Ось чому я опинився тут, шукаючи інше джерело інформації.
whoan

5

Сенс у тому, щоб мати різні алгоритми поводження з бінарними деревами, це не робити справ із деревами. На цьому абстрактному рівні одне замовлення значною мірою так само добре, як і будь-яке інше, оскільки ви отримуєте лише абстрактні символи поза процедурою.

Але дерева зазвичай використовуються для представлення цікавих речей, і це може істотно змінити результат. Наприклад, якщо вузли представляють пошукові стани в повному пошуку через великий домен (можливо, навіть нескінченний домен), низхідне спочатку проти обробки спочатку не тільки визначає, в якому порядку будуть знайдені результати, він навіть може визначити, чи будете ви коли-небудь знайти взагалі будь-які рішення . Справа найпростіше помітити з нескінченними доменами: якщо ви спуститеся обережно, ви можете не помітити рішення, яке лежить досить високо на дереві, просто тому, що ви зробили неправильний поворот. Але на практиці, оскільки пам'ять і диски також є кінцевими, це стосується навіть доменів, які просто дуже великі, а не справді нескінченні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.