《剑指offer》面试题25 二叉树中和为某一值的路径 Java版
(判断是否有从根到叶子节点的路径,其和为给定值。记录这些路径。)
我的方法:这道题我是按照回溯的思路去做的,我们需要一个数据结构来保存和删除当前递归函数中添加的值。这里要打印一条路径,我们可以选择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版的更多相关文章
- 剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)
		
问题描述: 输入一棵二叉树和一个整数,打印出二叉树中结点指的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.二叉树结点的定义如下: public class Tree ...
 - 剑指Offer - 九度1368 - 二叉树中和为某一值的路径
		
剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...
 - 剑指offer(24)二叉树中和为某一值的路径
		
题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 题目分析 这题基本上一看就知道应该深度遍历整个树, ...
 - 【剑指Offer】 24、二叉树中和为某一值的路径
		
题目描述: 输入一颗二叉树的根结点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中, ...
 - 【剑指Offer】24、二叉树中和为某一值的路径
		
题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
 - 【剑指offer】Q25:二叉树中和为某一值的路径
		
说明:最烦的就是看别人的博客,题解里直接上代码,一行分析都没有.只是这个题... class BTNode(): def __init__(self, val = -1): self.val = va ...
 - 剑指Offer:面试题14——调整数组顺序使奇数位于偶数前面(java实现)
		
问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路: 1.最简单的想法,不考虑时间复杂度,扫描数组,遇到偶数,先取出这 ...
 - 【Offer】[34] 【二叉树中和为某一值的路径】
		
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径.  ...
 - 剑指offer——面试题25:合并两个 排序的链表
		
自己答案: ListNode* MergeTwoSortedList(ListNode* pHead1,ListNode* pHead2) { if(pHead1==nullptr&& ...
 
随机推荐
- python3中OpenCV imwrite保存中文路径文件
			
原先一段将特征值保存为图片的代码,这部分学生的电脑上运行没有生成图片 代码的基本样子是: import os import cv2 import numpy as np def text_to_pic ...
 - java——HttpClient 代理模式发送Http Https
			
在setProxy()方法中设置代理IP后可以将url中的域名换成这个代理IP. http很简单,但是https这样会报错. 问题:如何使用代理发送https请求? 客户端发送https请求之前会先向 ...
 - Leaflet使用vector tiles 标注label设置
			
JS //简单的标注 var marker = L.marker([ 31.2, 114.5 ], { // icon:myIcon }).addTo(map) // 设置label .bindToo ...
 - asp.net 如何实现大文件断点上传功能?
			
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
 - Algorithm lesson final exam
			
1.algorithm analysis O B/W/AV/AMOR,混入其他问题,设计+分析 2.传统算法(肯定要考) 1)divide and conquer master therem. rec ...
 - LNK1104 无法打开文件“proj.lib”
			
两种可能: 1.proj.lib不存在 2.proj.lib不符合编译的debug(release)版本
 - VTK 编译过程中出现的hdf5长度(I64)错误解决办法
			
最近在使用vtk和cuda做大规模图像处理方面的问题研究,在编译vtk的过程中发现第三方库hdf5不能够解决I64长度的探测识别问题.为了节约大家的时间,现在把我经过实践得到的解决方案共享出来,这里要 ...
 - 【python学习之五】自定义函数实现用 Python 发送电子邮件
			
前言 之前论坛里有人发过关于发送邮件的帖子,设计器也有关于发送邮件的控件.我这里再次重复,希望能有帮到大家的地方. 信息准备 发送邮件前必须准备好一些基本信息,例如发件人邮箱地址.发件人邮箱密码.收件 ...
 - Java网络编程之Netty服务端ChannelOption.SO_BACKLOG配置
			
ChannelOption.SO_BACKLOG对应的是tcp/ip协议listen函数中的backlog参数,函数listen(int socketfd,int backlog)用来初始化服务端可连 ...
 - Spring Boot教程(十)异步方法测试
			
测试 测试代码如下: @Component public class AppRunner implements CommandLineRunner { private static final Log ...