题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从根节点开始往下一直到叶节点所经过的节点形成一条路径。
解题思路:当使用前序遍历的方式访问某一节点时,把该节点添加到路径上,并累积该节点的数值。如果该节点为叶节点,并且路径中节点的值等于输入的整数,则找到符合条件的路径。如果当前节点不是叶节点,则继续递归访问它的子节点。当前节点访问完递归函数回到它的父结点,因此要将当前节点从路径中删除,并且当前路径的和减去当前节点的值。
package Solution; import java.util.Stack; public class No25PathInTree { public static class BinaryTreeNode {
int value;
BinaryTreeNode left;
BinaryTreeNode right; public BinaryTreeNode(int value, BinaryTreeNode left,
BinaryTreeNode right) {
super();
this.value = value;
this.left = left;
this.right = right;
}
} public static void main(String[] args) {
BinaryTreeNode node5 = new BinaryTreeNode(2, null, null);
BinaryTreeNode node3 = new BinaryTreeNode(3, null, null);
BinaryTreeNode node4 = new BinaryTreeNode(4, null, node5);
BinaryTreeNode node7 = new BinaryTreeNode(2, null, null);
BinaryTreeNode node2 = new BinaryTreeNode(2, node3, node4);
BinaryTreeNode node6 = new BinaryTreeNode(6, node7, null);
BinaryTreeNode root1 = new BinaryTreeNode(1, node2, node6);
System.out.println("在路径中查询值为9的路径:");
findPath(root1, 9);
System.out.println("在路径中查询值为15的路径:");
findPath(root1, 15); } private static void findPath(BinaryTreeNode node, int expectedSum) {
if (node == null)
return;
// 保存路径
Stack<Integer> stack = new Stack<Integer>();
// 记录当前路径上节点的和
int currentSum = 0;
findPath(node, stack, expectedSum, currentSum); } public static void findPath(BinaryTreeNode node, Stack<Integer> stack,
int expectedSum, int currentSum) {
if (node == null)
return;
currentSum += node.value;
stack.push(node.value);
// 当前节点如果为叶节点,判断结点值的和是否为所要查询的值
if (node.left == null && node.right == null) {
if (currentSum == expectedSum) {
// 栈的结构类似于ArrayList,所以遍历栈会从栈底到栈顶的顺序访问栈中的元素
for (Integer trace : stack) {
System.out.print(trace + ",");
}
System.out.println();
}
}
if (node.left != null) {
findPath(node.left, stack, expectedSum, currentSum);
}
if (node.right != null) {
findPath(node.right, stack, expectedSum, currentSum);
}
// 当前节点访问结束后递归函数会返回它的父结点,所以在函数退出之前在路径上删除当前节点,并减去当前结点的值
// 由于参数传递中传递了当前结点参与运算的值,所以在函数退出当前栈帧后,currentSum会恢复成原来的值
stack.pop();
} }
剑指offer面试题25:二叉树中和为某一值的路径的更多相关文章
-
剑指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》面试题25 二叉树中和为某一值的路径 Java版
(判断是否有从根到叶子节点的路径,其和为给定值.记录这些路径.) 我的方法:这道题我是按照回溯的思路去做的,我们需要一个数据结构来保存和删除当前递归函数中添加的值.这里要打印一条路径,我们可以选择Li ...
-
【Offer】[34] 【二叉树中和为某一值的路径】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径.  ...
-
剑指offer——面试题25:合并两个 排序的链表
自己答案: ListNode* MergeTwoSortedList(ListNode* pHead1,ListNode* pHead2) { if(pHead1==nullptr&& ...
随机推荐
-
启动windows的服务--《用delphi开发共享软件》-15.2桌面提示器
在dos 下用命令启动一个服务:NET START "Windows Desktop Reminder" 一下为用delphi启动服务: Function RunProcess(s ...
-
【读书笔记】iOS-AppKit简介
一,IBOutlet和IBAction.它们实际上只是AppKit提供的#defines.IBOutlet的含义没有任何作用,因此将不对对它时行编译.IBAction定义为void,这意味着在AppC ...
-
从实用主义深入理解c++虚函数
记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数竟然不太确定,所以还是理解的不深刻,所以想通过这篇文章来巩固下. 装逼一刻: 最近,本人思想发生了巨大的转变,在大学的时候由 ...
-
laravel5.1启动详解
laravel的启动过程 如果没有使用过类似Yii之类的框架,直接去看laravel,会有点一脸迷糊的感觉,起码我是这样的.laravel的启动过程,也是laravel的核心,对这个过程有一个了解,有 ...
-
json返回日期格式化的解决
function jsonDateFormat(jsonDate) {//json日期格式转换为正常格式 try { var date = new Date(parseInt(jsonDate.rep ...
-
判断comboBox是否选对了绑定的数据库中的项
实现: comboBox1下拉列表已绑定数据库,将选中的项保存到数据库时,判断是否已选中下拉列表里的项 如果没选中,或者输入了其他的值,和已绑定的数据不匹配,出现提示框 按钮的点击事件中: strin ...
-
DTO学习系列之AutoMapper(五)----当EntityFramework爱上AutoMapper
有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易,相处不易. 在DDD(领域驱动设计)中,使用AutoMapp ...
-
nm和readelf命令的区别
其实问题的本质是对elf格式的理解问题,因为是查看so库的符号表发现的问题. 事情起因是这样的,由于我的一个程序编译的时候出现了undefined reference to “XXX”的错误,需要链接 ...
-
NGUI插件的一个扩展---NGUI_HUD_Text
NGUI_HUD_Text扩展主要用于主角跟随和伤害/治疗的功能. 场景大概是这样的,我们希望有一个主角,在其头顶显示他的名字,在单击鼠标左键的时候显示红色的“-10”表示减少血量,单击鼠标右键的时候 ...
-
centos6.5中rpm包安装mysql5.7(初始化出错如何解决)
下载rpm包见:http://www.cnblogs.com/grey-wolf/p/7472680.html 1.rz上传到服务器,解压缩 rz [root@mini2 upload]# -.el6 ...