Яка середня висота бінарного дерева?


10

Чи існує якесь формальне визначення середньої висоти двійкового дерева?

У мене є підручник щодо пошуку середньої висоти двійкового дерева за допомогою наступних двох методів:

  1. Природним рішенням може бути середня довжина всіх можливих шляхів від кореня до листя, тобто

    сер1(Т)=1# листя в Тv листя Тглибина(v) .

  2. Інший варіант - це визначити його рекурсивно, тобто середня висота для вузла - це середня над середньою висотою підкреслень плюс одна, тобто

    сер2(N(л,r))=сер2(л)+сер2(r)2+1

    з для листя і для порожніх слотів.l avh 2 ( _ ) = 0сер2(л)=1лсер2(_)=0

На основі мого теперішнього розуміння, наприклад, середня висота дереваТ

    1    
   / \
  2   3
 /
4

є за другим методом, який використовує рекурсію.сер2(Т)=1,25

Однак я все ще не зовсім розумію, як зробити перший. невірно.сер1(Т)=(1+2)/2=1.5


1
Чи можете ви надати певний контекст? Не існує такого поняття, як "правильне" математичне визначення; ви можете визначити "середню висоту двійкового дерева", як вам подобається. ( В середньому , що за те , що розподіл ?) Але різні визначення будуть більш-менш корисними для різних застосувань.
JeffE

@JeffE "Не відразу зрозуміло, як визначити середню висоту бінарного дерева. Мабуть, найбільш природним рішенням може бути середня довжина можливих шляхів від кореня до листа. Більш просте (можливо, навіть спрощене) рішення це сказати, що середня висота для вузла - це середня середня висота підкреслень плюс одна. Ви заповнюєте, простіше кодувати цю альтернативу. Чи можете ви навести приклади, щоб продемонструвати різницю? "
Вічний

Я намагався зробити ваш пост більш зрозумілим, даючи точні визначення двох варіантів. Перевірте, чи правильно я інтерпретував ваш текст. Зокрема, вам не вистачало якоря для другого варіанту; незалежно від того, чи берете ви листя на висоту один або нуль, це має значення.
Рафаель

Відповіді:


3

Немає підстав вважати, що обидва визначення описують однакову міру. Ви також можете записати рекурсивно:сер1

сер1(N(л,r))=lv(л)(аvгод1(л)+1)+lv(r)(аvгод1(r)+1)lv(л)+lv(r)

з для . Якщо ви не вірите, що це те саме, визначення праворуч або виконайте доказ індукції.l avh 1сер1(л)=0лсер1

Тепер ми бачимо, що працює зовсім інакше, ніж . Хоча зважує рекурсивні висоти дітей із вузлами однаково (додавання та ділення на два), зважує їх відповідно до кількості листків, які вони містять. Таким чином, вони однакові (по модулю якоря) для дерев, що врівноважуються листям, тобто збалансовані в тому сенсі, що у синових дерев однаково багато листя. Якщо ви спростите рекурсивну форму з це відразу видно. Однак на неврівноважених деревах вони різні.сер1сер2сер2сер1сер1lv(л)=lv(r)

Ваші розрахунки дійсно правильні (враховуючи ваше визначення); зауважте, що приклад дерево не врівноважується листям.


Чи можливо це показати код реалізації для , я не зовсім розумію, як це робити рекурсивносер1
Timeless

@null: Вибачте, я не розумію питання. Ви маєте на увазі, як довести, що рекурсивне визначення еквівалентне вашому? сер1
Рафаель

Я маю на увазі код реалізації з використанням рекурсії
позачасовий

@null: Ви можете скопіювати формулу майже буквально за умови включення базового регістру. Як саме це зробити, залежить від вашої мови програмування та реалізації дерева. Я пропоную вам скористатися повторним переповненням Stack Overflow, якщо реалізація стане для вас перешкодою.
Рафаель

2

Редагувати: Джефф вказує на свій коментар вище. Ви, ймовірно, повинні читати "правильне проти неправильного" у наступній відповіді як "зручно / послідовно проти непослідовно".

Здається, ваш другий розрахунок невірний. Нехай висота піддерева з одним вузлом (тобто листом) дорівнює 0. Тоді висота кореня підкреслити на:

  • висота при 4 дорівнює 0
  • висота при 3 дорівнює 0
  • висота на 2 - середня висота при 3 + 1 = 0 + 1 = 1
  • висота на 1 - середня висота на 2 і 3 = (0 + 1) / 2 + 1 = 1,5

Я думаю, ви робите перший розрахунок правильно, а 1.5 - правильна відповідь.


ідея - нульовий вузол висотою -1, виходячи з 2-го підходу, середній зріст вузла - середній підряд, плюс 1, середній висота вузла 4 ((-1) + (- 1)) / 2 + 1 = 0 , середня висота вузла 2 (0 + (- 1)) / 2 + 1 = 0,5, і тому середня висота кореня дорівнює 1,25.
Вічний

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