本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41910495

Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

For example:
Given the below binary tree and sum = 22,

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \      \
        7    2      1

return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

思路:

(1)题意为给定一个(每个节点带有数值)二叉树和一个整数,判断在二叉树中是否存在从树根到叶子节点路径使得路径之和等于给定的整数。

(2)我觉得该题主要考察对常用数据结构"栈"的熟悉和使用。包括栈的主要特性:先进后出、栈的peek()方法、栈的pop()方法、栈的push()方法。

(3)首先,通过分析可知,要想获取从树根到叶子节点的路径,必须对树进行遍历,本文应该按照:根—>左—>右的方式进行遍历。

(4)其次,需要考虑的是当我们遍历到叶子节点时,当路径值之和不等于给定值时,如何继续进行下去。

(5)再次,本文采用栈来存储路径上的节点,因为当遍历到叶子节点时,路径上节点值之和不等于给定值时只需将该叶子节点移除。首先,对根节点判空,如果为空返回null,如果只有一个根节点也需要进行特殊判断;然后,如果根节点不为空,将根节点压入栈中(为了让整棵树节点都可能被遍历到,只要栈中有元素就循环),并用临时变量count保存存入栈中节点的值,如果栈不为空就循环,取出栈顶元素,如果该元素有左孩子,就将左孩子压入栈中,并将值加到count中;如果该元素有右孩子,就将右孩子压入栈中,并将值加入count中;如果该元素没有左右孩子,且该元素不是树根,且count值和给定值相同,则返回true,否则将该元素从栈中移除,并从count中减去对应的值。

(6)在(5)中有一点在此处列出,需要特别注意:我们必须将每次从栈中弹出的节点保存在一个临时的Set中,并且在将节点的左右孩子存入栈中对其左右孩子是否在Set中进行判定,这样才能保证每个节点只进入栈一次,否则就会产生死循环。

(7)注:其中栈的peek()方法是取出栈顶元素,而不从栈中移除;栈的pop()方法是取出栈顶元素,并将其从栈中移除;栈的push()方法是将元素压入栈中;HashSet的contains()方法能够快速地判断某一元素是否在该Set中。

(8)这道题注意以上几个方面就能很容易得到正确答案。这道题其实不难,主要考察对数据结构中栈的使用,另外也对分析问题能力的考察。

(9)希望本文对你有所帮助。谢谢。

算法代码实现如下:

public static boolean hasPathSum(TreeNode root, int sum) {
	if (root == null)
		return false;
	if (root != null && root.left == null && root.right == null && root.val == sum)
		return true;
	//每个元素只能进栈一次
	Stack<TreeNode> stack = new Stack<TreeNode>();
	//保证元素值只进栈一次
	Set<TreeNode> set = new HashSet<TreeNode>();
	int count = 0;
	stack.push(root);
	count += root.val;
	while (stack.size() != 0) {
		TreeNode top = stack.peek();
		if (top.left != null && !set.contains(top.left)) {
			stack.push(top.left);
			count += top.left.val;
		} else if (top.right != null && !set.contains(top.right)) {
			stack.push(top.right);
			count += top.right.val;
		} else {
			if (top != root && top.left==null && top.right==null && count == sum) {
				return true;
			} else {
				TreeNode pop = stack.pop();
				set.add(pop);
				count = count - pop.val;
			}
		}
	}
	return false;
}

Leetcode_112_Path Sum的更多相关文章

  1. LeetCode - Two Sum

    Two Sum 題目連結 官網題目說明: 解法: 從給定的一組值內找出第一組兩數相加剛好等於給定的目標值,暴力解很簡單(只會這樣= =),兩個迴圈,只要找到相加的值就跳出. /// <summa ...

  2. Leetcode 笔记 113 - Path Sum II

    题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...

  3. Leetcode 笔记 112 - Path Sum

    题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...

  4. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

  5. BZOJ 3944 Sum

    题目链接:Sum 嗯--不要在意--我发这篇博客只是为了保存一下杜教筛的板子的-- 你说你不会杜教筛?有一篇博客写的很好,看完应该就会了-- 这道题就是杜教筛板子题,也没什么好讲的-- 下面贴代码(不 ...

  6. [LeetCode] Path Sum III 二叉树的路径和之三

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  7. [LeetCode] Partition Equal Subset Sum 相同子集和分割

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

  8. [LeetCode] Split Array Largest Sum 分割数组的最大值

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  9. [LeetCode] Sum of Left Leaves 左子叶之和

    Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are two l ...

随机推荐

  1. 解决使用web开发手机网页关于分辨率被缩放的坑

    问题的产生 因为各方面原因,要用网页做界面,开发一个APP.内核使用的是腾讯的x5内核. 把外壳交给前端和设计测试的时候,都汇报:状态栏的颜色太不搭配了,要求可修改 遂启用了安卓4.4版本开始支持的沉 ...

  2. matlab sparse函数和full函数用法详解(转)

    sparse函数 功能:Create sparse matrix-创建稀疏矩阵 用法1:S=sparse(X)--将矩阵X转化为稀疏矩阵的形式,即矩阵X中任何零元素去除,非零元素及其下标(索引)组成矩 ...

  3. PHP 包含

    PHP 包含文件 PHP include 和 require 语句 在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容. include 和 require 语句用于在执 ...

  4. ELK 6安装配置 nginx日志收集 kabana汉化

    #ELK 6安装配置 nginx日志收集 kabana汉化 #环境 centos 7.4 ,ELK 6 ,单节点 #服务端 Logstash 收集,过滤 Elasticsearch 存储,索引日志 K ...

  5. Scroll Segmented Control(Swift)

    今天用了一个github上一个比较好用的Segmented Control但是发现不是我要效果,我需要支持scrollView.当栏目数量超过一屏幕,需要能够滑动. 由于联系作者没有回复,我就自己在其 ...

  6. (译)openURL 在 iOS10中已弃用

    翻译自:openURL Deprecated in iOS10 译者:Haley_Wong 苹果在iOS 2 推出了 openURL:方法 作为一种打开外部链接的方式.而与之相关的方法 canOpen ...

  7. JSP基础概要

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/51925232 作者:朱培 ID:sdksdk0 一 ...

  8. SpringMVC+BUI实现文件上传(附详解,源码下载)

    中午有限时间写这博文,前言就不必多说了,直奔主题吧. BUI是一个前端框架,关于BUI的介绍请看博主的文章那些年用过的一些前端框架. 下面我们开始实例的讲解! 一.效果演示: 上传成功后,会发现本地相 ...

  9. RxJava(五) onErrorResumeNext操作符实现app与服务器间token机制

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51533586 本文出自:[余志强的博客] 一.需求场景: 在开发Ap ...

  10. [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/42240531 本文作者:sushengmiyan ------------------ ...