Поскольку вы отметили это как домашнее задание, я отвечу без исходного кода или псевдокода, но с более всесторонним описанием.
Поскольку ваше дерево будет содержать все значения, которые вы хотите включить в связанный список, мы должны убедиться, что достигли их всех.
Для этого нам нужно убедиться, что мы обрабатываем каждый листовой узел.
Для этого нам нужно убедиться, что мы обрабатываем каждый левый и правый дочерний элемент каждого узла.
Давайте начнем с корневого узла, на который обычно ссылаются, когда речь идет о двоичном дереве.
Я предполагаю, что вы знаете, как создать связанный список, последовательно добавляя к нему элементы.
Итак, чтобы обработать корневой узел, мы делаем это:
- Если корень содержит значение: добавьте значение в список
Это заботится об одном значении, которое может храниться в корневом узле. Некоторые двоичные деревья хранят значения только в конечных узлах (узлах без дочерних элементов), большинство хранит значения также во внутренних узлах (узлах с дочерними элементами).
Но это, конечно, ни к чему нас не приведет, поскольку мы добавляем только один элемент, и мы даже не знаем, где во всех значениях это конкретное значение, поэтому оно может быть первым, последним или любым другим между ними.
Но мы знаем, что если у корневого узла есть дочерние элементы в левом «направлении», то любые значения, которые мы могли бы найти во всех этих узлах, будут находиться перед узлом в корневом узле.
И мы также знаем, что если у корневого узла есть дочерние элементы в правильном «направлении», эти значения последуют за ним.
Итак, что мы можем сделать, это:
- Обработка всех узлов в левом поддереве
- Добавить значение в узел
- Обработка всех узлов в правом поддереве
Этот подход предполагает, что:
- Упорядочены значения узлов (т. Е. Левое поддерево предшествует значению самого узла и т. Д.)
- Вы хотите значения в их упорядоченной последовательности
Если вы определите вышеуказанный подход как метод, у вас будет что-то вроде этого:
to process a node, do this:
first process the left-child sub-node, if present
then append the value of the node, if any
then process the right-child sub-node, if present
В приведенном выше псевдокоде, где вы видите слово «процесс», вы применяете тот же процесс к этим узлам, как описано выше.
Вот код C # для обработки простого двоичного дерева и добавления результата к заданному связанному списку:
public void AppendTreeToLinkedList<T>(Node<T> node, LinkedList<T> list)
{
if (node.LeftChild != null)
AppendTreeToLinkedList(node.LeftChild, list);
list.Append(node.Value);
if (node.RightChild != null)
AppendTreeToLinkedList(node.RightChild, list);
}