#java #recursion #tree #binary-tree #treenode
Вопрос:
Студент CS здесь практикуется на leetcode.
У меня возникла следующая проблема:
Понятия не имею, хорош этот код или нет, был бы признателен за некоторые отзывы и там, но вот что я придумал:
class Solution { public TreeNode mergeTrees(TreeNode root1, TreeNode root2) { TreeNode ret = traverse(root1, root2); return ret; } public TreeNode traverse(TreeNode node1, TreeNode node2){ TreeNode newNode = new TreeNode(); if(node1 == null amp;amp; node2 == null){ return null; } else if(node1 == null){ newNode.val = node2.val; } else if(node2 == null){ newNode.val = node1.val; } else{ newNode.val = node1.val node2.val; newNode.left = traverse(node1.left, node2.left); newNode.right = traverse(node1.right, node2.right); } return newNode; }
}
Кажется, все работает нормально с образцом ввода, приведенным в примере. Однако, когда я представляю проблему, мне дается этот случай:
Я пришел к ожидаемому ответу, когда разработал его на бумаге на основе написанного мной кода. Я не уверен, почему в этом случае мой код выдает ошибочный результат. Помоги мне здесь
ИЗМЕНИТЬ: Изменена формулировка для ясности
Комментарии:
1. @kcsquared извини! будет редактировать
Ответ №1:
Проблема в том, что вы возвращаете значение только тогда, когда оба узла равны нулю, а не для другого случая, когда любой узел равен нулю. Ваш код не переходит в оператор else для случая «либо null», и он возвращается вызывающей функции.
Измененный код ниже:
if(node1 == null amp;amp; node2 == null){ return null; } else if(node1 == null){ newNode.val = node2.val; return node2; } else if(node2 == null){ newNode.val = node1.val; return node1; } else{ newNode.val = node1.val node2.val; newNode.left = traverse(node1.left, node2.left); newNode.right = traverse(node1.right, node2.right); }
Поскольку newNode не играет никакой роли, вы можете отказаться от него и объединить его непосредственно с узлом roo1.
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) { if(root1 == null amp;amp; root2 == null) { return null; } else if(root1 == null) { return root2; } else if (root2 == null) { return root1; } else { root1.val = root1.val root2.val; root1.left = mergeTrees(root1.left, root2.left); root1.right = mergeTrees(root1.right, root2.right); } return root1;
Это должно сработать для вас.
Комментарии:
1. Не могу сказать, что понимаю. В любом из случаев elseif/else, newNode обновляется и возвращает, затем, newNode. Если только node1 и node2 не являются нулевыми, он должен возвращать новый код с соответствующим поддеревом, если только я чего-то не упустил.
2. Ваш код работает правильно в 2 случаях 1. когда оба ваших узла равны нулю 2. когда оба ваших узла не равны нулю, ваш код не работает ни для одной из сторон null, потому что вы не возвращаетесь, а выходите.
3. В любом случае null всегда возвращается ваш корень newNode, который в данном случае равен 2.