题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从根节点开始往下一直到叶节点所经过的节点形成一条路径。

解题思路:当使用前序遍历的方式访问某一节点时,把该节点添加到路径上,并累积该节点的数值。如果该节点为叶节点,并且路径中节点的值等于输入的整数,则找到符合条件的路径。如果当前节点不是叶节点,则继续递归访问它的子节点。当前节点访问完递归函数回到它的父结点,因此要将当前节点从路径中删除,并且当前路径的和减去当前节点的值。

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:二叉树中和为某一值的路径的更多相关文章

  1. 剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)

    问题描述: 输入一棵二叉树和一个整数,打印出二叉树中结点指的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.二叉树结点的定义如下: public class Tree ...

  2. 剑指Offer - 九度1368 - 二叉树中和为某一值的路径

    剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...

  3. 剑指offer(24)二叉树中和为某一值的路径

    题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 题目分析 这题基本上一看就知道应该深度遍历整个树, ...

  4. 【剑指Offer】 24、二叉树中和为某一值的路径

      题目描述:   输入一颗二叉树的根结点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中, ...

  5. 【剑指Offer】24、二叉树中和为某一值的路径

    题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...

  6. 【剑指offer】Q25:二叉树中和为某一值的路径

    说明:最烦的就是看别人的博客,题解里直接上代码,一行分析都没有.只是这个题... class BTNode(): def __init__(self, val = -1): self.val = va ...

  7. 《剑指offer》面试题25 二叉树中和为某一值的路径 Java版

    (判断是否有从根到叶子节点的路径,其和为给定值.记录这些路径.) 我的方法:这道题我是按照回溯的思路去做的,我们需要一个数据结构来保存和删除当前递归函数中添加的值.这里要打印一条路径,我们可以选择Li ...

  8. 【Offer】[34] 【二叉树中和为某一值的路径】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径.  ...

  9. 剑指offer——面试题25:合并两个 排序的链表

    自己答案: ListNode* MergeTwoSortedList(ListNode* pHead1,ListNode* pHead2) { if(pHead1==nullptr&& ...

随机推荐

  1. pythone函数基础(11)读,写,修改EXCEL

    #读EXCEL需要导入xlrd模块---在python控制台pip install xlrd模块import xlrdbook = xlrd.open_workbook('stu3.xls')shee ...

  2. 分析abex-crackme#1

    1.分析环境2.运行程序,了解大致的运行过程3.运行Ollydbg调试程序3.1.分析结果简述4.破解4.1.方法一4.2.方法二5.运行结果6.与书中不同之处 1.分析环境 操作系统:Win10 1 ...

  3. Kubernetes 1.3.1 快速单机部署

    Kubernetes发展到今天, 在官网上已经有非常多的成熟部署方案, 但是由于墙的原因, 最简单的MiniKube都无法进行, 参考了以下两篇文章后, 终于安装成功. k8s-1.13版本测试环境搭 ...

  4. github ignore 规范

    转自:https://www.cnblogs.com/xuld gitignore 应该包含 5 块内容: 当前项目需要忽略的文件 项目性质需要忽略的文件(比如是 nodejs 项目,有些文件就需要忽 ...

  5. docker创建镜像及push镜像出错问题

    docker build  出错 Got permission denied while trying to connect to the Docker daemon socket at unix:/ ...

  6. dubbo服务达成jar包

    <build> <finalName>dubbo-provider</finalName> <!-- jar包名,一般设置为提供者服务名 --> < ...

  7. 5-1 unittest框架使用

    unittest是python的一个单元测试框架,内置的,不需要pip install  什么什么的.直接在py文件里面调用 import unittest. 他这个框架是怎么回事呢,他可以对数据初始 ...

  8. JAVA实训第二次作业

    一维数组的创建和遍历. 声明并创建存放4个人考试成绩的一维数组,并使用for循环遍历数组并打印分数.要求: (1) 首先按"顺序"遍历,即打印顺序为:从第一个人到第四个人: (2) ...

  9. Git与SVN的区别(面试常问)

    1.Git是分布式的,而SVN不是分布式的 2.Git把内容按元数据方式存储,而SVN是按文件 3.Git没有一个全局版本号,SVN有,目前为止这是SVN相比Git缺少的最大的一个特征 4.Git的内 ...

  10. css摘要

    由于需要,今天花三个小时了解一下css,在此记录一些摘要: 参考w3school 1. 当同一个 HTML 元素被不止一个样式定义时,会使用哪个样式呢? 一般而言,所有的样式会根据下面的规则层叠于一个 ...