2016-04-10 2 views
1

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

public static Node lookup(Node node, int lookupValue) { 

     if (node == null) { 
      return null; 
     } else { 
      if (node.value == lookupValue) { 
       System.out.println("Found"); 
       return node; 
      } else if(node.left != null) { 
       return lookup(node.left, lookupValue); 

      } else if(node.right != null) { 
       return lookup(node.right, lookupValue); 
      } else { 
       return null; 
      } 
     } 
} 
+0

Если это не бинарное дерево, то почему только правый и левый узел подкрепляются – bugwheels94

+0

извинений , это действительно бинарный obv – dgalati54

+0

Является ли это bst или значениями не в определенном порядке? – Joni

ответ

2

Вы возвращаете все возвращаемое из левого поддерева (если оно имеется) без проверки правильного. Большая часть разветвления else не требуется, если в блоке if есть оператор return. Изменить следующим образом:

public static Node lookup(Node node, int lookupValue) { 
    if (node == null) 
     return null; 
    if (node.value == lookupValue) 
     // System.out.println("Found"); 
     return node; 
    Node rval = lookup(node.left, lookupValue); 
    // only return if found in left sub-tree 
    return (rval != null) ? rval : lookup(node.right, lookupValue); 
} 
0

Ваш else if не правильно, вы chould проверить левый и правый everytimes:

if (node == null) return null; 
if (node.value == lookupValue) { 
    System.out.println("Found"); 
    return node; 
} 
Node found = lookup(node.left, lookupValue); 
if(found != null) { 
    return found; 
} 
return lookup(node.right, lookupValue); 
Смежные вопросы