<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842716</guid>
        <pubDate>Thu, 10 Dec 2020 06:22:09 +0000</pubDate>
        <title>Поиск наидлиннейшего пути в бинарном дереве поиска</title>
        <link>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842716</link>
        <description><![CDATA[FasterHarder: В общем у меня ВРОДЕ получилось, но сделал я, конечно, не так, как мне тут подсказывали, т к в приведенных подсказках везде нужно было подниматься от потомка к родителю. Разумеется, алгоритм неоптимальный получился) + я вот далеко не уверен, что он работает корректно на всех конфигах ДДП<br>
<br>
Просто находил ДЛЯ КАЖДОГО УЗЛА ДДП высоты левого и правого поддерева, суммировал их и проверял с максимальной. На рис., как я понимаю, длиннейший путь = 6, ну, прожка так и выдает.<br>
<br>
Единственное, что мне не оч.нравится, что пришлось задействовать глобальную переменную, т е не чистая рекурсия получилась.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int maxP = 0;</div><div class="code_line">int GMP(const TREE* root)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(root != NULL)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LPK(root-&#62;left);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LPK(root-&#62;right);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int currentP = GH(root-&#62;left) + GH(root-&#62;right) - 1; // вот эта &quot;-1&quot; связана с логикой функции G(et)H(eight) + потомки не должны быть листьями оба одновременно, поэтому одного из потомка &quot;поднимаем&quot; на 1 уровень вверх, отбирая у пути одну единицу движения</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(currentP &#62; maxP)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;maxP = currentP;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return maxP;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<span class="b-attach" data-size="25434" data-hits="1623" data-attach-id="62782" data-attach-post-id="3842716">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3842716&amp;attach_id=62782' title='Скачать файл' target='_blank'>__________________________________.png</a> (, : 1623)
		</span><br>
<br>
зы: когда ДДП-ЛОС, то в пути теряется 1, печалька) Хотя тут может проблема не только в этом...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842706</guid>
        <pubDate>Wed, 09 Dec 2020 16:37:05 +0000</pubDate>
        <title>Поиск наидлиннейшего пути в бинарном дереве поиска</title>
        <link>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842706</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=420994&view=findpost&p=3842702'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2020-12-09T12:32:21+00:00">09.12.20, 12:32</time></span><div class='quote '>би-родитель, это хто?) Вершина, имеющая левого и правого потомка?</div></div><br>
Он<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=420994&view=findpost&p=3842702'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2020-12-09T12:32:21+00:00">09.12.20, 12:32</time></span><div class='quote '>ты говоришь неоднократно &quot;двигаться вверх&quot;, но структура дерева не имеет линка parent, а только left/right</div></div><br>
Дерево - всего лишь исходные данные, к которым никто не мешает прилепить что-то дополнительное. Кстати, отсутствие линка на родителя - обычай, но не догма.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=420994&view=findpost&p=3842702'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2020-12-09T12:32:21+00:00">09.12.20, 12:32</time></span><div class='quote '>что ты будешь делать, когда ДДП является ЛОСом? Там всего лишь 1 узел является листом...</div></div><br>
Обработаю этот единственный особый случай отдельно.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=420994&view=findpost&p=3842703'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>AVA12 &#064; <time class="tag-quote__quoted-time" datetime="2020-12-09T15:32:13+00:00">09.12.20, 15:32</time></span><div class='quote '>Нет необходимости строить все возможные пути, а потом отбрасывать лишние. Достаточно знать высоты всех поддеревьев и &quot;корень&quot;, через который проходит длиннейший путь. </div></div><br>
Всё равно предобработка...]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842704</guid>
        <pubDate>Wed, 09 Dec 2020 15:54:59 +0000</pubDate>
        <title>Поиск наидлиннейшего пути в бинарном дереве поиска</title>
        <link>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842704</link>
        <description><![CDATA[FasterHarder: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=420994&view=findpost&p=3842703'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>AVA12 &#064; <time class="tag-quote__quoted-time" datetime="2020-12-09T15:32:13+00:00">09.12.20, 15:32</time></span><div class='quote '>Для поиска &quot;корня&quot; нужно обойти дерево в глубину.</div></div><br>
именно такой вариант дали на одном из форумов, процитирую:<br>
&quot;Обходим дерево в глубину, проставляя в каждый узел высоту.<br>
От корня начинаем спускаться к самому дальнему листу (выбирая на каждом шаге самого высокого потомка) и сравниваем максимальную длину пути с вершиной в данном узле с текущей максимальной длиной пути. Останавливаемся, когда становится известно, что длиннее уже не получится.&quot;<br>
<br>
а также готовую рекурсивную функцию на шарпе, но там такая функция, что переписать на Си, например, пока непонятно как)]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842703</guid>
        <pubDate>Wed, 09 Dec 2020 15:32:13 +0000</pubDate>
        <title>Поиск наидлиннейшего пути в бинарном дереве поиска</title>
        <link>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842703</link>
        <description><![CDATA[AVA12: Небольшие замечания к алгоритму, который предложил <strong class='tag-b'>Akina</strong>:<br>
<br>
Нет необходимости строить все возможные пути, а потом отбрасывать лишние. Достаточно знать высоты всех поддеревьев и &quot;корень&quot;, через который проходит длиннейший путь. Чтобы этот путь восстановить, нужно спуститься из этого &quot;корня&quot; влево и вправо, каждый раз выбирая потомка с максимальной высотой и занося посещенную вершину в список пути. (После чего отбросить первый или последний лист).<br>
<br>
Для поиска &quot;корня&quot; нужно обойти дерево в глубину. Для каждого узла/листа храним высоту его поддерева H (изначально 0). Отдельно храним длину лучшего найденного пути L (изначально 0) и ссылку на &quot;корень&quot; этого пути P. Каждый раз, поднимаясь из потомка к родителю, пишем в H родителя MAX(H_родителя, H_потомка + 1). Когда посещены оба потомка, длина максимального пути, для которого узел является &quot;корнем&quot;, равна сумме H дочерних узлов. Если эта длина больше L, то в L пишем эту длину, а в P пишем ссылку на узел.]]></description>
        <author>AVA12</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842702</guid>
        <pubDate>Wed, 09 Dec 2020 12:32:21 +0000</pubDate>
        <title>Поиск наидлиннейшего пути в бинарном дереве поиска</title>
        <link>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842702</link>
        <description><![CDATA[FasterHarder: <strong class='tag-b'>Akina</strong>, спс за достаточно полное описание<br>
би-родитель, это хто?) Вершина, имеющая левого и правого потомка?<br>
2. Вот ты говоришь неоднократно &quot;двигаться вверх&quot;, но структура дерева не имеет линка parent, а только left/right. Это ведь важно оказывается вроде <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-12-09T12:38:08+00:00">09.12.20, 12:38</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=420994&view=findpost&p=3842700'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2020-12-09T12:18:53+00:00">09.12.20, 12:18</time></span><div class='quote '>Изначально очевидно, что одним концом такого пути будет лист, а другим - узел, потомки которого листья (или единственный потомок - лист). так что для унификации мы просто ищем максимальный путь между двумя листьями, а потом отбрасываем единичку (любой из конечных листов заменяем на его родителя).</div></div><br>
это красивый подход, но, что ты будешь делать, когда ДДП является ЛОСом? Там всего лишь 1 узел является листом...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842700</guid>
        <pubDate>Wed, 09 Dec 2020 12:18:53 +0000</pubDate>
        <title>Поиск наидлиннейшего пути в бинарном дереве поиска</title>
        <link>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842700</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=420994&view=findpost&p=3842698'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2020-12-09T12:00:26+00:00">09.12.20, 12:00</time></span><div class='quote '>Нужно найти самый длинный путь (максимальной длины) между двумя любыми вершинами дерева с разным числом потомков.</div></div><br>
Очевидно, речь идёт о пути, который посещает любой узел не более одного раза.<br>
<br>
Изначально очевидно, что одним концом такого пути будет лист, а другим - узел, потомки которого листья (или единственный потомок - лист). так что для унификации мы просто ищем максимальный путь между двумя листьями, а потом отбрасываем единичку (любой из конечных листов заменяем на его родителя).<br>
Далее - такой путь поднимается вверх по дереву до общего родителя, потом спускается.<br>
Итог - следует перебирать все узлы, являющиеся би-родителем, для каждого находить максимальный по длине путь до листа в левой и правой ветви. Решением будет комбинация пары таких путей, которые показывают максимальную суммарную длину в пределах дерева.<br>
<br>
Как бы я решал. Берём все листья. От каждого начинаем двигаться вверх (желательно делать это по уровням). На каждом родителе для дальнейшего движения из двух пришедших в него путей оставляем длиннейший, а текущую сумму сравниваем с текущей максимальной в аккумуляторе, и если она больше, то перезаписываем аккумулятор, кладя в него и новую макс. сумму, и оба составляющих её пути. По завершении в аккумуляторе будем иметь длиннейший путь (если таковых несколько - какой-то один из них, или можно запоминать все).]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842698</guid>
        <pubDate>Wed, 09 Dec 2020 12:00:26 +0000</pubDate>
        <title>Поиск наидлиннейшего пути в бинарном дереве поиска</title>
        <link>https://forum.sources.ru/index.php?showtopic=420994&amp;view=findpost&amp;p=3842698</link>
        <description><![CDATA[FasterHarder: Всем хай&#33; Сходу к делу&#33;<br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue"><em class='tag-i'><strong class='tag-b'>Дано двоичное дерево поиска. Ключи - целые числа. Нужно найти самый длинный путь (максимальной длины) между двумя любыми вершинами дерева с разным числом потомков.</strong></em></span><br>
<br>
Для начала я бы хотел уточнить:<br>
1. путь может проходить как угодно по дереву, т е, например из левого дерева подниматься к корню и затем уходить в правое поддерево? Т е путю необязательно двигаться по связям вершин дерева?<br>
2. вроде гарантируется, что одной из такой вершин будет лист, т к появление листа гарантировано увеличивает протяженность пути на +1. Два листа быть не может, т к у них будет равное число потомков = 0.<br>
3. число потомков ведь может быть 0, когда берется лист<br>
4. вроде не гарантируется, что эти две вершины будут лежать по разные стороны от корня исходного дерева? Например, ДДП, которое выродилось в ЛОС, там все элементы принадлежат одному из поддеревьев. Кстати, в случае ЛОС-ДДП максимальный путь будет проложен от корня до листа.<br>
<br>
Какие мысли есть: найти кол-во потомков для КАЖДОГО узла исходного ДДП (это я знаю, как сделать). А даст ли это что-нибудь?&#33; Наверное, придется еще получить номер уровня для каждого узла дерева, не знаю)<br>
<br>
Может существует какое-то простое решение (типа одной рекурсивной функцией), решающее такую проблему??<br>
<br>
P.S. возможно, что здесь нужно каким-то боком задействовать дин.прогр. + может быть, преобразовать структуру в граф (хотя дерево и так есть разновидность графа в любом случае)]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	