2016-11-07 1 views
1

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

public void cursorToParent() 
{ 
    TreeNode parent = root; 
    if(cursor == root) 
     return; 
    if(parent.getLeft().equals(cursor) || parent.getRight().equals(cursor)) 
     cursor = parent; 
    else 
     if(parent.getLeft()!=null) 
     { 
      parent = parent.getLeft(); 
      cursorToParent(); 
     } 
     if(parent.getLeft()!=null) 
     { 
      parent = parent.getLeft(); 
      cursorToParent(); 
     } 

} 
+0

Вам необходимо передать аргумент методу 'cursorToParent'. Для получения большей помощи, Отправьте пример ожидаемого результата. Благодаря! – iNan

+0

Я делаю дерево, в котором курсор перемещается на основе ответа «да» или «нет» (слева или справа от дерева). например, если корень красного цвета, да (правый узел) = яблоко, нет (левый узел) = оранжевый. Поэтому, если мой курсор сейчас оранжевый. Когда я вызываю свой метод, я хочу, чтобы курсор переместился к родительскому оранжевому, что является красным. @iNan –

ответ

0

Необходимо передать обрабатывающий узел current в метод. Таким образом, там должен быть метод cursorToParentImpl(), который будет вызываться с root от первого способа:

public boolean cursorToParentImpl(TreeNode current) 
{ 
    if(cursor == current) 
     return false; 
    if(current.getLeft() == cursor || current.getRight() == cursor) { 
     cursor = current; 
     return true; 
    } 
    else { // note the missing parenthesis too 
     if(current.getLeft()!=null) { 
      if (cursorToParentImpl(current.getLeft())) 
       return true; 
     } 
     if(current.getRight()!=null) { 
      if (cursorToParentImpl(current.getRight())) 
       return true; 
     } 
    } 
    return false; 
} 

И называют это:

public void cursorToParent() 
{ 
    if (cursor == root) 
     return; 
    cursorToParentImpl(root); 
} 

Кроме того, вы можете избежать вызова equals() и просто использовать == оператор как здесь следует скорее сравнить ссылку на узлы.

+0

Я попробовал то, что у вас есть, он просто возвращает местоположение курсора –

+0

Извините, я имел в виду, что он дал нулевой указатель^ –

+0

второй рекурсивный вызов, который имеет правильную ветвь с неправильной охраной, она должна проверять 'current.getRight()! = null'. он в настоящее время вызывает 'getLeft()'. – robbmj

Смежные вопросы