2017-02-18 5 views
-1

Update: Лучшее решение должно быть:Java тест два бинарных деревьев одинаковы

public boolean isSameTree(TreeNode p, TreeNode q) { 

    if(p==null&&q==null) return true; 
    if(p==null||q==null) return false; 

    return isSameTree(p.left, q.left)&&isSameTree(p.right, q.right)&&(p.val==q.val); 
} 

Обновление: Спасибо всем, я знаю, что эти другие решения, которые вы сказали мне, но мой вопрос почему мое решение не работает. Это потому, что я игнорирую некоторые возвращаемые значения? Спасибо!


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

Большое спасибо! Вот код:

/*Definition for a binary tree node. 
    public class TreeNode { 
    int val; 
    TreeNode left; 
    TreeNode right; 
    TreeNode(int x) { val = x; } 
*/ 

public boolean isSameTree(TreeNode p, TreeNode q) { 
    if(p!=null){ 
     if(q!=null&&p.val==q.val){ 
      isSameTree(p.left, q.left); 
      isSameTree(p.right, q.right); 
     } 
     else return false; 
    }else{ 
     if(q!=null) return false; 
    } 
    return true; 
} 

Вход: [10,5,15] [10,5, NULL, NULL, 15] Выход: истинный Ожидаемое: ложные

+0

Если выходной ток не соответствует вашему желаемых результатов, и вы не знаете, почему, то пришло время, чтобы начать отладку. Если вы не знаете, как это сделать, пожалуйста, посмотрите: [Отладка небольших программ] (http://ericlippert.com/2014/03/05/how-to-debug-small- программы /). Он не решит вашу прямую проблему, но он даст вам шаги, которые вы можете выполнить, которые должны помочь вам решить ее самостоятельно или даже если это не удастся, а затем, по крайней мере, помочь вам лучше изолировать вашу проблему, чтобы ваш вопрос мог быть более сфокусированным и легче отвечать. –

+0

isSameTree() имеет возвращаемое значение. Не игнорируйте его. –

+0

@duffymo безопасно использовать == для int –

ответ

0

Вы просто вызывает isSameTree для дочерних деревьев, но не проверяет их возвращаемые значения. Сжатый и правильная версия:

public boolean isSameTree(TreeNode p, TreeNode q) { 
    if (p == q) { //Will accept null == null 
     return true; 
    } 
    return p != null && q != null && p.val == q.val && 
     isSameTree(p.left, q.left) && isSameTree(p.right, q.right); 
} 

Кроме того, @duffymo было неправильным указанием вам необходимо использовать .equals() вместо ==. Вы сравниваете val, которые являются примитивами.

+0

p == q check не является действительной проверкой, так как это фактический вопрос, который мы пытаемся решить. – hhafeez

+0

Если оба они ссылаются на один и тот же объект, то они будут логически эквивалентны. Они не уточнили, хотят ли они гарантированного глубокого сравнения. Таким образом, я выбрал более эффективное решение. –

+0

Это не имеет никакого отношения к тому, как мы ищем. «если они ссылаются на один и тот же объект». Что ж! Разве мы этого не пытаемся решить? Разве это не проблема? Если мы знаем p == q или нет, тогда нет ничего, что можно было бы решить. Все остальные операторы if являются избыточными, тогда – hhafeez

0
public boolean isSameTree(TreeNode p, TreeNode q) { 
     if(p!=null){ 
      if(q!=null&&p.val==q.val){ 
       if(!isSameTree(p.left, q.left)) return false; 
       if(!isSameTree(p.right, q.right)) return false; 
       return true; 
      } 
      else return false; 
     }else{ 
      if(q!=null) return false; 
     } 
     return true; 
    } 
+0

Это решение неверно. Во время моего комментария код: if (! IsSameTree (p.left, q.left)) возвращает false; if (! isSameTree (p.right, q.right)) возвращает true; не должен возвращать true, если правильные поддеревья не равны. –

+1

@MattGoodrich вы правы. Спасибо! –

0

Я предполагаю, что у вас есть метод GET для извлечения data.One образом, вы можете решить это позволить методы isSameTree принимать нулевые значения, а затем сравнить.

public boolean isSameTree(TreeNode p, TreeNode q) { 

     if (p == q) { 
      return true; 
     } 
     if (p == null || q == null) { 
      return false; 
     } 

     return p.get().isSameTree(q.get()) && 
       isSameTree(p.left(), q.left()) && 
       isSameTree(p.right(), q.right()); 
    } 

Другой способ заключается в следующем:

public boolean isSameTree(TreeNode p, TreeNode q) 
    { 

     if (p == null && q == null) 
      return true; 


     if (p != null && q != null) 
      return (p.get == q.get 
        && isSameTree(p.left, q.left) 
        && isSameTree(p.right, q.right)); 


     return false; 
    } 
+0

Проверка p == q - это фактическая проблема, которую пытается решить ОП – hhafeez

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