tenkmilan уже отлично показал, как представить этот код.
Здесь я go другой путь и пишу более простой inorder
обход. Должно быть достаточно ясно, как это можно сопоставить с предоставленным кодом.
Обход inorder
достаточно прост. preorder
и postorder
являются другими наиболее распространенными обходами деревьев, и они работают на произвольных конечных деревьях. Inorder определен только для двоичных деревьев и использует left
- и right
-детей вашего узла. Порядок обхода состоит в том, чтобы (рекурсивно) пройти по левому потомку, затем посетить сам узел и, наконец, (рекурсивно) пройти по правому потомку.
Мы можем написать такой обход просто:
const inorder = (tree) =>
tree
? [
... inorder (tree .left),
tree .data,
... inorder (tree .right)
]
: []
У нас есть базовый случай, когда узел, на который мы смотрим, пуст, и мы просто возвращаем пустой массив. В общем случае мы просто объединяем рекурсивный вызов на left .tree
со значением нашего текущего узла и рекурсивный вызов на right .tree
.
Это все, что нужно для inorder
обхода. Вы можете увидеть это в действии в этом фрагменте:
const inorder = (tree) =>
tree
? [
... inorder (tree .left),
tree .data,
... inorder (tree .right)
]
: []
const tree = {
data: 'F',
left: {
data: 'B',
left: {data: 'A'},
right: {
data: 'D',
left: {data: 'C'},
right: {data: 'E'}
}
},
right: {
data: 'H',
left: {data: 'G'},
right: {data: 'I'}
}
}
console .log (inorder (tree))
Конечно, это для простого дерева, хранящегося в виде простого JS объекта. Но сопоставить ваш пример кода достаточно просто. Я предполагаю, что если вы можете следовать этому, вы можете быстро следовать этому.