Это вопрос в литкоде. «Учитывая двоичное дерево и сумму, найдите все пути от корня до листа, где сумма каждого пути равна данной сумме». Но мой код не может пройти тест из-за превышения времени. Но код решения (https://oj.leetcode.com/discuss/15169/14-line-solution-in-java-using-recursion) может передать тестовый пример. Я не понимаю, есть ли большая разница с двумя версиями кодов?Эффективность времени обхода двоичного дерева
Мой код:
public class Solution {
List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> pathSum(TreeNode root, int sum) {
if (root == null)
return res;
List<Integer> t = new ArrayList<Integer>();
has(root, sum, t);
return res;
}
public void has(TreeNode root, int sum, List<Integer> t) {
if (root == null)
return;
if (root.left == null && root.right == null && sum == root.val) {
t.add(root.val);
res.add(t);
return;
}
t.add(root.val);
has(root.right, sum - root.val, t);
has(root.left, sum - root.val, t);
return;
}
}
Решение:
public class Solution {
public static List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
if(root==null) return list;
if (root.val==sum && root.left==null && root.right==null) {
list.add(new ArrayList<Integer>());
list.get(list.size()-1).add(root.val);
return list;
}
list.addAll(pathSum(root.left, sum-root.val));
list.addAll(pathSum(root.right, sum-root.val));
for(List<Integer> l:list)
l.add(0, root.val);
return list;
}
}
Когда мой код попал в лист, и я сохраню результат в глобальной переменной «res». Я думаю, что мой код подходит для логики. –
Нет, это не так, вы не храните ничего в res. Ваша идея правильная, но вы ее неправильно реализуете. – Auberon
Ой, подождите, я снова посмотрел на ваш код, и вы правы. Держись, дай мне узнать вашу ошибку. – Auberon