本文是在学习中的总结,欢迎转载但请注明出处: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. Docker容器如何互联

    容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式. 该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息. 自定义容器命名 连接系统依据容器的名称来执 ...

  2. Jeff Atwood倾情推荐——程序员必读之书

    英文版:<Code Complete 2>中文版:<代码大全(第二版)>作者:Steve McConnell译者:金戈  汤凌  陈硕  张菲出版社:电子工业出版社出版日期:2 ...

  3. Dynamics CRM REST Builder

    今天介绍个很棒的工具叫CRM REST Builder,不管是2016之前的odata查询或者现在的web api都不在话下,界面如下,选项非常丰富 这里以retrieve multiple举个例子, ...

  4. JAVA面向对象-----局部内部类

    局部内部类 局部内部类概述:包含在外部类的函数中的内部类称之为局部内部类. 访问:可以在包含局部内部类的方法中直接创建局部内部类的对象调用局部内部类的成员. 注意:局部内部类只能访问所在函数的fana ...

  5. 指令汇B新闻客户端开发(四) 自动轮播条

    在这个新闻客户端,我们可以看到有一个轮播页面,在这个项目中,用Handler和一个定时器来做更容易一些, 我们定义一个Handler: private Handler mHandler; 定时器的代码 ...

  6. Python Skelve 库

    在Python中有一个简单的轻量级的类似于Key-value的存储型数据库,那就是Skelve.下面就来一起看一看这个库的简单的使用吧. 小例子 我本人比较喜欢从例子出发,然后再来研究这些内部的行为. ...

  7. TCP的发送系列 — tcp_sendmsg()的实现(二)

    主要内容:Socket发送函数在TCP层的实现 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 在上篇blog中分析了tcp_sendmsg()这个主要函 ...

  8. Servlet编程实例-servlet学习之旅(三)

    LoginServlet代码: public class LoginServlet extends HttpServlet{ @Override protected void service(Http ...

  9. 4. React 属性和状态介绍

            React 中的属性和状态初看之下可以互相替代,但是在 React 的设计哲学中两者有着截然不同的使用方式和使用场景. 属性的含义和用法         props = propert ...

  10. 收藏了4年的Android 源码分享

    Android 超过2个G的源代码集合~~几乎涵盖了所有功能效果的实现,一应俱全~~应有尽有~~ 360云盘地址:Android 各类源码集合汇总 (提取码:f930) 另外,附上Github上及自己 ...