(判断是否有从根到叶子节点的路径,其和为给定值。记录这些路径。)

我的方法:这道题我是按照回溯的思路去做的,我们需要一个数据结构来保存和删除当前递归函数中添加的值。这里要打印一条路径,我们可以选择List、栈等,它们都可以很方便的删除掉末尾的元素从而保护现场,也可以选择String,只需要在进入递归的时候创建一个和参数一样的值,也能做到在子函数退出的时候保护现场的效果。递归的时候先判断是否满足条件,然后添加本节点的值往下递归。

  1. public void findPath(TreeNode root, int target){
  2. if (root == null) {
  3. return;
  4. }
  5. Stack<TreeNode> path = new Stack<TreeNode>();
  6. int sum = 0;
  7. find2(path, root, sum, target);
  8. }
  9. private void find(Stack<TreeNode> path, TreeNode root, int sum, int target){
  10. if(sum > target)return;
  11. if(root == null && sum < target)return;
  12. if(root == null && sum == target){
  13. for(TreeNode treeNode : path){
  14. System.out.print(treeNode.val+" ");
  15. }
  16. System.out.println();
  17. return;
  18. }
  19. if(root != null){
  20. if(root.left != null || root.right != null){//如果左右子树有不空的,向下寻找
  21. if(root.left != null){
  22. path.push(root);
  23. sum += root.val;
  24. find(path, root.left, sum, target);
  25. sum -= root.val;
  26. path.pop();
  27. }
  28. if(root.right != null){
  29. path.push(root);
  30. sum += root.val;
  31. find(path, root.right, sum, target);
  32. sum -= root.val;
  33. path.pop();
  34. }
  35. }else{//如果左右子树都空了,说明到了叶子节点
  36. path.push(root);
  37. sum += root.val;
  38. //发送结束信息
  39. find(path, null, sum, target);
  40. sum -= root.val;
  41. path.pop();
  42. }
  43. }
  44. }

书中方法:先添加本节点值,然后判断是否满足条件,接着往下递归。

  1. public void findPath(TreeNode root, int target){
  2. if (root == null) {
  3. return;
  4. }
  5. Stack<TreeNode> path = new Stack<TreeNode>();
  6. int sum = 0;
  7. find2(path, root, sum, target);
  8. }
  9. private void find2(Stack<TreeNode> path, TreeNode root, int sum, int target){
  10. path.push(root);
  11. sum += root.val;
  12. if(sum > target){
  13. path.pop();
  14. return;
  15. }
  16. if(sum == target && root.left == null && root.right == null){
  17. //从栈底到栈顶打印
  18. for(TreeNode treeNode : path){
  19. System.out.print(treeNode.val+" ");
  20. }
  21. System.out.println();
  22. }
  23. if(root.left != null)find2(path, root.left, sum, target);
  24. if(root.right != null)find2(path, root.right, sum, target);
  25. //保护现场
  26. path.pop();
  27. }

这道题如果是任意路径,而不要求从根节点到叶子节点。那么思路应该是分为两层递归,外层递归就是遍历二叉树,内层寻找路径。

《剑指offer》面试题25 二叉树中和为某一值的路径 Java版的更多相关文章

  1. 剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)

    问题描述: 输入一棵二叉树和一个整数,打印出二叉树中结点指的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.二叉树结点的定义如下: public class Tree ...

  2. 剑指Offer - 九度1368 - 二叉树中和为某一值的路径

    剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...

  3. 剑指offer(24)二叉树中和为某一值的路径

    题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 题目分析 这题基本上一看就知道应该深度遍历整个树, ...

  4. 【剑指Offer】 24、二叉树中和为某一值的路径

      题目描述:   输入一颗二叉树的根结点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中, ...

  5. 【剑指Offer】24、二叉树中和为某一值的路径

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

  6. 【剑指offer】Q25:二叉树中和为某一值的路径

    说明:最烦的就是看别人的博客,题解里直接上代码,一行分析都没有.只是这个题... class BTNode(): def __init__(self, val = -1): self.val = va ...

  7. 剑指Offer:面试题14——调整数组顺序使奇数位于偶数前面(java实现)

    问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路: 1.最简单的想法,不考虑时间复杂度,扫描数组,遇到偶数,先取出这 ...

  8. 【Offer】[34] 【二叉树中和为某一值的路径】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径.  ...

  9. 剑指offer——面试题25:合并两个 排序的链表

    自己答案: ListNode* MergeTwoSortedList(ListNode* pHead1,ListNode* pHead2) { if(pHead1==nullptr&& ...

随机推荐

  1. jvm——class类文件的结构

    class类文件并不一定以磁盘的形式存在,也可以是由类加载器直接生成的二进制流,他其实是一种数据结构,类似于c语言结构体,这种数据结构只有两种数据类型:无符号数和表. 1.魔数:类似于文件拓展名,CA ...

  2. rmq——同步、异步、单向、rocketMQ console、消费模式

    官网上下载:rocketmq-all-4.5.0-bin-release 配置环境变量:

  3. 通过页面名字调用页面并添加到tab控件中

    /// <summary> /// 动态 显示 tab /// </summary> /// <param name="sFromName">类 ...

  4. java中System类

    System作为系统类,在JDK的java.lang包中,可见它也是一种java的核心语言特性.System类的构造器由private修饰,不允许被实例化.因此,类中的方法也都是static修饰的静态 ...

  5. 2018山东省赛 H Dominoes ( 搜索 )

    题目链接 题意 : 给出一个 n * m 的矩阵,用规格 1 * 2 的多米诺去填充,题目数据保证最后只有一个格子是空白的(即没有被多米诺骨牌覆盖),问你现在通过移动多米诺能够产生多少种不同的状态(空 ...

  6. jQuery_完成省市二级联动

    当填表的时候会让你设计某省某市怎么设计,应该明白,如果你选择了一个确定的省,那么在第二个下拉框内则不会有除了你选择的省的市之外的名称.而这功能用js来实现很麻烦,但是用jq确很容易实现. 原表结构: ...

  7. SSM整合之---简单选课系统

    简单选课系统 一.实体图 二.功能 三.代码实现 1.SSM环境搭建 (1)pom.xml <dependencies> <dependency> <groupId> ...

  8. Java文件中代码

    public class MyTextView extends TextView { //在用代码创建的时候调用 public MyTextView(Context context) { this(c ...

  9. java生成二维码学习笔记

    纠错等级: QRErrorCorrectLevel.L 7%的字码可被修正 QRErrorCorrectLevel.M 15%的字码可被修正 QRErrorCorrectLevel.Q 25%的字码可 ...

  10. Python中的self用法之面向对象

    class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def ...