剑指offer-24-二叉树中和为某一值的路径

二叉树中和为某一值的路径_牛客网

https://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca?tpId=13&tqId=11177&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

在这道题目的答案中根本就没有校验数组的长度啊,真的是错误的引导
做题之前忘记了对于树类型的题目,一般有两种做法:递归的做法和非递归的做法,递归的做法通常代码量少而且意图看起来非常清晰明确,而非递归的做法节约空间,但是写起来麻烦尤其是在临界的判断
针对这道题目刚开始用的是非递归,但是没想到调试了好久都没有调试出来,太衰了
递归做法如下:

public class Solution {
    private ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    private ArrayList<Integer> list = new ArrayList<>();
    public ArrayLis

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

小白刷剑指offer 文章被收录于专栏

跟着小白一起刷剑指offer,通过讨论加深印象吧~ 没有人不学习就能够掌握知识,知识就是需要学习的~

全部评论
因为result.add(list)是吧list这个对象的引用地址添加到result了,result中的元素就会共用list,而list是我们用来存放当前路径的地方,因此我们需要复制一份之后加入result数组中
8 回复 分享
发布于 2019-11-14 20:27
如何解决“在返回值的list中,数组长度大的数组靠前”这一问题呢? 通过将程序中的左右子树搜索顺序交换一下就无法通过了,可见并未排序,只是测试集不全面
2 回复 分享
发布于 2020-01-06 21:06
请问这步 list.remove(list.size()-1);为什么啊?
2 回复 分享
发布于 2019-11-26 23:07
非递归的方式: public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) { ArrayList<ArrayList<Integer>> result = new ArrayList<>(); if (root == null) { return result; } Map<ArrayList<Integer>, ArrayList<TreeNode>> treeNodes = new HashMap<>(); ArrayList<Integer> key = new ArrayList<>(); key.add(root.val); if (root.val == target && root.left == null && root.right == null) { result.add(key); return result; } ArrayList<TreeNode> value = new ArrayList<>(); if (root.left != null) { value.add(root.left); } if (root.right != null) { value.add(root.right); } treeNodes.put(key, value); while (treeNodes.size() > 0) { Map<ArrayList<Integer>, ArrayList<TreeNode>> temp = new HashMap<>(); for (ArrayList<Integer> arrayList : treeNodes.keySet()) { ArrayList<TreeNode> tree = treeNodes.get(arrayList); int sum = 0; for (Integer integer : arrayList) { sum += integer; } for (TreeNode treeNode : tree) { ArrayList<Integer> arrayList1 = new ArrayList<>(arrayList); arrayList1.add(treeNode.val); if (sum + treeNode.val == target && treeNode.right == null && treeNode.left == null) { result.add(0, arrayList1); } else { ArrayList<TreeNode> treeNodes1 = new ArrayList<>(); if (treeNode.left != null) { treeNodes1.add(treeNode.left); } if (treeNode.right != null) { treeNodes1.add(treeNode.right); } if (treeNodes1.size() > 0) { temp.put(arrayList1, treeNodes1); } } } } treeNodes = temp; } return result; }
1 回复 分享
发布于 2020-02-27 23:16
递归就是压栈,自己新建一个栈,通过一个中间量栈帧来实现非递归,对同学的代码略作了修改。 import java.util.ArrayList; import java.util.Stack; public class Solution { public static class StackFrame { public TreeNode node; public int target; public ArrayList<Integer> path; public StackFrame(TreeNode node, int target, ArrayList<Integer> path) { this.node = node; this.target = target; this.path = path; } } public static ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) { ArrayList<ArrayList<Integer>> result = new ArrayList<>(); if (root == null) { return result; } Stack<StackFrame> stack = new Stack<>(); stack.push(new StackFrame(root, target, new ArrayList<>())); while (!stack.isEmpty()) { StackFrame stackFrame = stack.pop(); stackFrame.path.add(stackFrame.node.val); int rs = stackFrame.target - stackFrame.node.val; if (rs == 0 && stackFrame.node.left == null && stackFrame.node.right == null) { result.add(new ArrayList<>(stackFrame.path)); } if (rs > 0) { if (stackFrame.node.right != null) { stack.push(new StackFrame(stackFrame.node.right, rs, new ArrayList<>(stackFrame.path))); } if (stackFrame.node.left != null) { stack.push(new StackFrame(stackFrame.node.left, rs, new ArrayList<>(stackFrame.path))); } } } return result; } }
1 回复 分享
发布于 2020-01-28 19:22
题目中要求“按字典序打印”,这个方案中最后是不是要对result进行一次排序操作?
点赞 回复 分享
发布于 2021-04-11 00:14
请问ArrayList<arraylist><integer>> result1 = FindPath(root.left, target);的时候。已经到了叶子结点为空返回result了即if(root == null)return result;那么想看右节点合不合适需要进行 ArrayList<arraylist><integer>> result2 = FindPath(root.right, target);但是已经返回result如何进行右节点</integer></arraylist></integer></arraylist>
点赞 回复 分享
发布于 2020-05-24 16:48
你能理解list.remove(list.size()-1)么?为什么啊?
点赞 回复 分享
发布于 2020-05-12 10:40
为什么前两句的初始化要放在方法外,还要设置成私有呢?
点赞 回复 分享
发布于 2020-05-09 19:13
楼主 这个问题: 在返回值的list中,数组长度大的数组靠前,不用考虑吗,迷惑
点赞 回复 分享
发布于 2020-04-05 18:20
遇到递归就感觉脑子不够用
点赞 回复 分享
发布于 2020-04-04 01:53
好的,后续研究研究更新一下文档
点赞 回复 分享
发布于 2020-02-28 10:38
题解里面都能看到你,猛啊老哥
点赞 回复 分享
发布于 2019-12-27 20:47
问一下 为什么要执行这一步呀 list.remove(list.size()-1) 是要删除刚添加的数吗 而且这一步在递归后,按道理说,是删除了子递归添加的数据呀
点赞 回复 分享
发布于 2019-12-20 19:34
非递归的话,可以自己新增一个栈来管理数据....
点赞 回复 分享
发布于 2019-11-17 11:43
只有add方法是这样的吗?
点赞 回复 分享
发布于 2019-11-17 11:16
result.add(new ArrayList<integer>(list));这句为什么不能直接result.add(list)</integer>
点赞 回复 分享
发布于 2019-11-07 22:54

相关推荐

01-30 22:03
门头沟学院 Java
用微笑面对困难:我滴妈,【俩月】【实习】【主管】仨debuff吃满了,独立设计开发的项目写了绝大占比的运营板块,你独立开发,那维护、问题复盘、日志更新、bug、策划书全是自己整的? 不建议写那么大,可以从小出发更容易
点赞 评论 收藏
分享
评论
65
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务