本文是在学习中的总结,欢迎转载但请注明出处: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. linux系统运维面试题简答

    1.     简述常用高可用技术 解答: Keepalived:Keepalived是一个保证集群高可用的服务软件,用来防止单点故障,使用VRRP协议实现.在master和backup之间通过mast ...

  2. find函数用法详解

    语法:find (string, sub3tring<, modifiers, startpos>),返回substring首次在string中出现的位置,若未找到,则返回0.其中:mod ...

  3. CSS布局套路

    这篇笔记的目的是记录分别应用float和flex布局的方法.主要是对遇到的问题进行总结. 1.float布局 总结: 1.1 使用float布局要清除浮动,清除的方法是,在父元素添加如下样式 .cle ...

  4. Lua语言模型 与 Redis应用

    Lua语言模型 与 Redis应用 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis. 本篇博客主要介绍了 Lua 语言不一样的设计 ...

  5. Android Studio精彩案例(二)《仿微信动态点击底部tab切换Fragment》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 现在很多的App要么顶部带有tab,要么就底部带有tab.用户通过点击tab从而切换不同的页面(大部分情况时去切换fragment). ...

  6. ant编译mysql驱动

    修改驱动源码后需要重新编译构建,由于mysql编译需要两个jdk版本且还需要hibernate4和junit,这里记录下. 安装ant. 配置两个jdk,5和8.并修改build.xml配置,如下: ...

  7. 将Gradle项目发布到Jcenter和Maven Central

    Jcenter和Maven Central 为了方便我们理解Android studio是如何帮助我们获取开源库的,我们需要理清几个概念.Apache Maven是Apache开发的一个工具,提供了用 ...

  8. java解决Url带中文参数乱码问题

    首先打开Tomcat安装目录,打开conf文件,打开server.xml,找到这段代码: <Connector port="8080" protocol="HTTP ...

  9. [ExtJS5学习笔记]第三十六节 报表组件mzPivotGrid

    mzPivotGrid 是一个报表组件,采用这个组件之后,可以令你的应用体现更多的价值. 什么是pivot grid 什么是mzPivotGrid 学习资源 与图表组件的融合 什么是pivot gri ...

  10. Android 如何监听输入法关闭事件

    假设有如下界面(输入法的上面的输入区域是用Dialog实现的) 要求当输入法关闭的时候,Dialog也一起关闭,这样用户就不需要返回两次了. 网上找了很多资料都没有很好的解决这个问题,输入法是第三方程 ...