2014-09-08 10 views
3

У меня возникли проблемы с поиском последнего элемента (самого правого ребенка) в моем двоичном дереве.Найти правых детей в двоичном дереве java

Это то, что я до сих пор:

public Node findLastElement(Node root) { 
    Node x = root; 
    if (x != null) 
     findLastElement(x.right); 
    return x; 
} 

Если я печатаю элементы, последний один, который печатает последний элемент, но я не могу показаться, чтобы «получить» этот элемент. Когда я пытаюсь вернуть x после цикла, я получаю nullpointer. Как сохранить последний элемент и вернуть его?

+0

так называемой «последний элемент» должен относиться к определенному обходному порядку; в противном случае это не имеет смысла. Это последний элемент обхода в порядке. – Tony

ответ

5

Вы можете получить самый правый элемент рекурсивно как таковой:

public Node findLastElement(Node root) { 
    if (root == null) { 
     return null; 
    } 
    if (root.right == null) { 
     return root; 
    } 
    return findLastElement(root.right); 
} 

Вы также можете сделать это итеративно. Итерация обычно лучше с точки зрения памяти, потому что у нее нет дополнительных стековых кадров, созданных с рекурсией.

public Node findLastElement(Node root) { 
    if(root == null) { 
     return null; 
    } 
    Node x = root; 
    while(x.right != null) { 
     x = x.right; 
    } 
    return x; 
} 

И нет особой необходимости для переменной темп x. Поскольку java передает ссылку по значению (они являются копией исходной ссылки), любое присваивание, которое мы делаем во входном аргументе root, является локальным и не отражается вне метода findLastElement.

public Node findLastElement(Node root) { 
    if(root == null) { 
     return null; 
    } 
    while(root.right != null) 
     root = root.right; 
    return root; 
} 
+1

+1. Хорошо, это ответ «все в одном». – JosEduSol

+0

Благодарим вас за показ различных вариантов! :) – user16655

4

Вам необходимо вернуть результат вызова рекурсивной функции.

E.g.

public Node findLastElement(Node x) { 
    if (x != null && x.right != null) 
     return findLastElement(x.right); 
    else 
     return x; 
} 
+0

Отлично, спасибо! Теперь логично, что я вижу правильный код. – user16655

+1

NPE для x == null – maszter

+0

@maszter Простое исправление ... javadoc \ @throws NPE, если Node равно null. ;-) –

0

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

public Node findLastElement(Node root) { 
    Node x = root; 
     if(x != null){ 
      if (x.right != null) 
       return findLastElement(x.right); 
     } 
    return x; 
} 
+2

Не может работать, вы, наконец, вернете корень – maszter

+0

@maszter: спасибо, что указали это! – Abhinav

2

Дополнительная проверка на х, если метод вызывается с пустым аргументом

public Node findLastElement(Node root) { 
    Node x = root; 

    if (x != null && x.right != null) { 
     return findLastElement(x.right); 
    } else { 
     return x; 
    } 

} 
+0

Как это работает, если ваш метод недействителен? – maszter

+0

@maszter: извините, ошибка при написании кода –

+0

Проверьте передачу нулевого аргумента при первом вызове –

0

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

public Node findLastElement(Node root) { 
    return root != null && root.right != null ? findLastElement(root.right) : root; 
} 
Смежные вопросы