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

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

	public void findPath(TreeNode root, int target){
if (root == null) {
return;
}
Stack<TreeNode> path = new Stack<TreeNode>();
int sum = 0;
find2(path, root, sum, target);
} private void find(Stack<TreeNode> path, TreeNode root, int sum, int target){
if(sum > target)return;
if(root == null && sum < target)return;
if(root == null && sum == target){
for(TreeNode treeNode : path){
System.out.print(treeNode.val+" ");
}
System.out.println();
return;
}
if(root != null){
if(root.left != null || root.right != null){//如果左右子树有不空的,向下寻找
if(root.left != null){
path.push(root);
sum += root.val;
find(path, root.left, sum, target);
sum -= root.val;
path.pop();
}
if(root.right != null){
path.push(root);
sum += root.val;
find(path, root.right, sum, target);
sum -= root.val;
path.pop();
}
}else{//如果左右子树都空了,说明到了叶子节点
path.push(root);
sum += root.val;
//发送结束信息
find(path, null, sum, target);
sum -= root.val;
path.pop();
}
}
}

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

    	public void findPath(TreeNode root, int target){
if (root == null) {
return;
}
Stack<TreeNode> path = new Stack<TreeNode>();
int sum = 0;
find2(path, root, sum, target);
}
private void find2(Stack<TreeNode> path, TreeNode root, int sum, int target){
path.push(root);
sum += root.val; if(sum > target){
path.pop();
return;
}
if(sum == target && root.left == null && root.right == null){
//从栈底到栈顶打印
for(TreeNode treeNode : path){
System.out.print(treeNode.val+" ");
}
System.out.println();
}
if(root.left != null)find2(path, root.left, sum, target);
if(root.right != null)find2(path, root.right, sum, target);
//保护现场
path.pop();
}

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

《剑指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. python 脚本制作

    U盘拷贝 当U盘插入主机时 被系统识别挂载后 通过python代码自动的去读取U盘中的资料并且进行拷贝 寄存在U盘上的 把硬盘上的资料进行读取并移动到U盘里 有点像 繁殖性 传输性 破坏性 破坏系统或 ...

  2. NOIP2016提高A组五校联考3总结

    第一题,本来一开始就想到了数位dp,结果脑残地打了十几个转移方程,总是调试不出来,一气之下放弃了. 调第一题几乎调了整节比赛,第二第三都没它. 第二题连边找联通块. 第三题题解都打了三页,看都不想看. ...

  3. 【NOIP2016提高A组模拟9.15】Osu

    题目 分析 考虑二分答案, 二分小数显然是不可取的,那么我们将所有可能的答案求出来,记录在一个数组上,排个序(C++调用函数很容易超时,手打快排,时间复杂度约为\(O(>8*10^7)\),但相 ...

  4. Quantitative Strategies for Achieving Alpha (三)

    chapter 4: Profitability Profitability measures we tested include return on invested capital, return ...

  5. 百分号编码(URL编码)

    百分号编码又叫做URL编码,是一种编码机制,只要用于URI(包含URL和URN)编码中. URL中那些字符需要编码,又为什么进行编码 一.URL是什么?  URL(Uniform Resource L ...

  6. javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint,NotBlank判断不能为空

    java 验证出现如下错误: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for c ...

  7. 浏览器主页在不知情的情况下设置为duba.com和newduba.cn

    原来是安装了“驱动精灵”. 真是个垃圾! 不通知用户的情况下,自动给锁定主页. 真TMD恶心 离倒闭不远了,现在只能通过这种方式来获取流量.

  8. MFC多文档获取窗口句柄

    GET App   AfxGetInstanceHandle()    AfxGetApp()   GET Frame->View->Document     SDI    AfxGetM ...

  9. Codeforces Round #403---C题(DFS,树)

    C. Andryusha and Colored Balloons time limit per test 2 seconds memory limit per test 256 megabytes ...

  10. legend3---lavarel中使用qq邮箱发送邮件

    legend3---lavarel中使用qq邮箱发送邮件 一.总结 一句话总结: 第一步:配置邮箱做服务器,比如qq邮箱,网易163邮箱 第二步:配置lavarel的配置文件 第三部:写邮件发送代码就 ...