Право Многопоточность бинарного дерева

голоса
0

У меня ад времени, пытаясь понять это. Везде я смотрю, я, кажется, работает только в объяснения о том, как на самом деле пройти через список нерекурсивно (часть я действительно понимаю). Может ли кто-то там забивают, как именно я могу пройти через список первоначально и найти фактический предшественник / преемник узлов, так что я могу флаг им в классе узла? Мне нужно, чтобы быть в состоянии создать простое бинарное дерево поиска и переход по списку и перенаправлять нулевые ссылки на предшественник / преемник. У меня было немного удачи с раствором несколько, как в следующем:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
Задан 29/07/2009 в 19:11
источник пользователем
На других языках...                            


1 ответов

голоса
1

Из вашего описания, я предполагаю, что у вас есть узел со структурой ищет что-то вроде:

Node {
  left
  right
}

... и что у вас есть бинарное дерево из них созданы с помощью левой и правой, и что вы хотите, чтобы переназначить значения влево и вправо так, что он создает doublely-связанный список из глубины первого обхода дерево.

Корень (не каламбур) проблема с тем, что вы получили до сих пор является то , что «узел р» (сокращенно предыдущих?) , Который передается во время обхода должен быть независимым от того, где в дереве вы в настоящее время - это всегда должен содержать ранее посещенной узел. Чтобы сделать это, каждый раз , когда поток запускается он должен ссылаться на один и тот же «предыдущий» переменную. Я сделал некоторые Python-МОГ псевдокод с одной С-изма - если вы не знакомы, « & » означает «ссылка» (или «ссылка» в C #), и «*» означает «разыменования и дать мне объект это указывает на».

Node lastVisited
thread(root, &lastVisisted)

function thread(node, lastVisitedRef)
  if (node.left)
    thread(node.left, lastVisitedRef)
  if (node.right)
    thread(node.right, lastVisitedRef)

  // visit this node, reassigning left and right
  if (*lastVisitedRef)
    node.right = *lastVisitedRef
    (*lastVisitedRef).left = node
  // update reference lastVisited
  lastVisitedRef = &node

Если вы собираетесь осуществить это в C, вы на самом деле нужен двойной указатель содержать ссылку, но идея та же - вы должны сохраняться местоположение «последней посещенной узла» в течение всего обхода.

Ответил 31/07/2009 в 05:36
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more