Haskell: получить путь от каждого конечного узла к корню в структуре дерева ячеек

#haskell #binary-tree

#haskell #двоичное дерево

Вопрос:

Мне нужно поработать, но я не знаю, как это сделать. У меня есть дерево ячеек

     1
   /  
  2    3
 /   / 
4  5  6  7
  

И мне нужно найти путь от корня к узлу с помощью координаты [i, j].
Например: (2, 2) -> [1, 3, 6]

 fromRoot :: Int -> Int -> Tree a -> [a]
  

Я написал некоторую функцию для Index и BinTree, но как создать функцию main, я не знаю.

 data Tree a = Node (Tree a) a (Tree a)

index :: Tree a -> Int -> Int -> a
index (Node _ x _ ) 0 _ = x
index (Node l x r) i j  | ((border i)<j) = index r (i-1) (j-(border i)-1)       
                        | otherwise = index l (i-1) j


border :: Int -> Int
border 0 = 0
border 1 = 0
border l = 2*(border (l-1)) 1

myBuild :: Int  -> Tree Int
myBuild n = (Node (myBuild (n*2)) n (myBuild (n*2 1)))
  

Комментарии:

1. Что такое координаты? Почему входные данные (2,2) соответствуют выходным [1,3,6] данным? Что должны представлять два Int входа для index ?

2. уровень и номер элемента. (0 0) -> 1; (1 0) -> 2; (2 1) -> 5

Ответ №1:

Поскольку это домашнее задание, я не буду давать полное решение, но некоторые подсказки:

  • как вы представляете пустое дерево с вашим типом дерева?
  • как вы представляете дерево примера (или любое другое конечное дерево)?

Учитывая основную функцию: она необязательно нужна, хороший способ начать — запустить

 ghci your_source_file.hs
  

Затем вы можете оценить части вашей программы, например:

 fromRoot 2 3 t1 -- if you have a t1 is a tree
  

Кроме того, вы могли бы написать основную функцию, подобную этой:

 test_tree = ...   -- you need to fill in the dots (see questions above)

main :: IO ()
main = do print (fromRoot 2 2 test_tree)
  

Если вам нужно найти какую-либо документацию, используйте http://haskell.org/hoogle /

Комментарии:

1. test_tree = myBuild 1 это создает мое дерево ячеек. Я понимаю, что мне нужна некоторая рекурсия в fromRoot и некоторое сравнение, но как это правильно написать, я не знаю : (

2. test_tree бесконечно, вероятно, не то, что вы хотите. Вы должны вывести дерево из Show: data Tree a = Node (Tree a) a (Tree a) deriving Show . Затем вы можете попытаться вычислить myBuild 1 в ghci (Ctrl-C вам поможет ;-)).

3. Лучшим термином было бы «выводить отображение для дерева».

4. Извините, ребята, но я не понимаю, как это должно быть. Не могли бы вы предоставить мне полное решение, пожалуйста.

5. Какие конкретные вопросы у тебя есть, ПеПе? Вы подумали о вопросах, которые я вам задал? Вы использовали ghci? Без дополнительной информации вам действительно сложно помочь.