Функция двоичного дерева Эрланга - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть совершенное двоичное дерево, в котором каждый узел представлен следующим образом:

[Value, LeftNode, RightNode] 

Значение - это значение узла, а каждый LeftNode и RightNode - это сыновья узла, которые являются рекурсивными слишком двоичными деревьями. И последние узлы (листья) представлены так:

[Value, [], []]

пример:

L1=[4, [], []], 
L2=[5, [], []], 
L3=[6, [], []], 
L4=[7, [], []], 
L5=[2, L1, L2], 
L6=[3, L3, L4], 
Tree=[1,L5 , L6].

, поэтому у меня есть функция, которая возвращает последний левый лист

lastLeftLeaf([H, [], []]) ->H;
lastLeftLeaf([H, Left, Right]) ->lastLeftLeaf(Left). 

в нашем примере это возвращает 4: значение L1. И функция, которая возвращает дерево без последнего левого листа: она заменяет этот лист на []

withoutLastLeftLeaf([H, [], []]) ->[] ;
withoutLastLeftLeaf([H, Left, Right]) ->[H, withoutLastLeftLeaf(Left), Right].

, в нашем примере она возвращает дерево без L1: которое заменено на []

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

1 Ответ

0 голосов
/ 28 апреля 2020

Вы можете объединить две написанные вами функции, и новая функция вернет результат в виде {Value, NewTree}. Для случая, когда вы уже на листе, все просто:

take_last_left_leaf([H, [], []]) -> {H, []};

Затем в любой другой точке дерева вы вернетесь в левую ветвь, получите значение и новую левую ветвь. и затем верните значение вместе с измененным деревом:

take_last_left_leaf([H, Left, Right]) ->
    {Value, NewLeft} = take_last_left_leaf(Left),
    {Value, [H, NewLeft, Right]}.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...