Обход дерева для нахождения узла

Я перерываю дерево для нахождения значения, которое передается. К сожалению, это не работает. Я начал отлаживать его с печатью, и что является странным, это, на самом деле находит значение, но пропускает оператор возврата.

    /**
  * Returns the node with the passed value
  */
 private TreeNode searchNodeBeingDeleted(Comparable c, TreeNode node)
 {  
  if(node == null) 
  {
   return null;
  }

  if(c.equals((Comparable)node.getValue()))
  {
   System.out.println("Here");
   return node;
  }
  else
  {
   if(node.getLeft() != null)
   {
    System.out.println("left");
    searchNodeBeingDeleted(c, node.getLeft());
   }
   if(node.getRight() != null)
   {
    System.out.println("right");
    searchNodeBeingDeleted(c, node.getRight());
   }
  }
  return null; //i think this gives me my null pointer at bottom
 }

Это распечатывает результаты следующим образом:

left
left
right
right
Here
right
left
right
left
right
Exception in thread "main" java.lang.NullPointerException
at Program_14.Driver.main(Driver.java:29)

Я не знаю, поможет ли это, но здесь является моим деревом:

     L
   /   \
  D     R
 / \   / \
A   F M   U
 \       / \
  B     T   V

Спасибо за внимание.

5
задан Tanay 10 August 2013 в 16:21
поделиться

4 ответа

Попробуйте следующее:

private TreeNode searchNodeBeingDeleted(Comparable c, TreeNode node)
 {  
  if(node == null) 
  {
   return null;
  }

  if(c.equals((Comparable)node.getValue()))
  {
   System.out.println("Here");
   return node;
  }
  else
  {
   if(node.getLeft() != null)
   {
    System.out.println("left");
    TreeNode n = searchNodeBeingDeleted(c, node.getLeft());
    if (n != null) {
      return n;
    }
   }
   if(node.getRight() != null)
   {
    System.out.println("right");
    TreeNode n = searchNodeBeingDeleted(c, node.getRight());
    if (n != null) {
      return n;
    }
   }
  }
  return null; //i think this gives me my null pointer at bottom
 }
4
ответ дан 14 December 2019 в 04:37
поделиться

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

1
ответ дан 14 December 2019 в 04:37
поделиться

Возможно, вместо насмешек над Runtime.getRuntime () .exec () можно «поиздеваться» над сценарием/программой/и т.д. он должен был звонить.

Вместо передачи реальной последовательности командной строки в exec () запишите тестовый сценарий и выполните его вместо него. Сценарий может возвращать жестко закодированные значения, которые можно протестировать, как и издевательский класс.

-121--2402851-

Используя общедоступные средства доступа (getters & setters) частных членов A...

-121--2172903-

Я думаю, что вы должны возвратить значение seaseNaseDisteredDeleted (c, node.getLeft ()) и seeyNaseDetedDeleted (c, node.getRight ()) ,

1
ответ дан 14 December 2019 в 04:37
поделиться

Предполагая, что ваше дерево является двоичным деревом поиска , а не "обычным" двоичным деревом .

Вы должны возвращать свои рекурсивные вызовы и не возвращать null в конце вашего метода.

Примерно так:

private TreeNode searchNodeBeingDeleted(Comparable c, TreeNode node) {
    if(nodle == null) return null;
    int diff = c.compareTo((Comparable)node.getValue());
    if (diff == 0) { // yes, we found a match!
        System.out.println("Here");
        return node;
    }
    else if (diff < 0) { // traverse to the left
        System.out.println("left");
        return searchNodeBeingDeleted(c, node.getLeft());
    }
    else {  // traverse to the right
        System.out.println("right");
        return searchNodeBeingDeleted(c, node.getRight());
    }
}
2
ответ дан 14 December 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: