题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二叉树结点的定义如下:
struct BinaryTreeNode{
       int      m_nValue;
       BinaryTreeNode*      m_pLeft;
       BinaryTreeNode*      m_pRight;
}

测试用例:
1)功能测试(二叉树有一条、多条符合条件的路径,二叉树中没有符合条件的路径);
2)特殊输入测试(指向二叉树根结点的指针为null指针)。

代码实现:
package com.yyq;
import java.util.Iterator;
import java.util.Stack;
/**
* Created by Administrator on 2015/9/20.
*/
public class PathInTree {
public static void findPath_1(BinaryTreeNode pRoot, int expectedSum){
if (pRoot == null)
return;
Stack<Integer> path = new Stack<Integer>();
int currentSum = 0;
findPath_2(pRoot, expectedSum, path, currentSum);
}
public static void findPath_2(BinaryTreeNode pRoot,int expectedSum,Stack<Integer> path,int currentSum){
currentSum += pRoot.getM_nValue();
path.push(pRoot.getM_nValue());
//如果是叶结点,并且路径上结点的和等于输入的值
//打印出这条路径
boolean isLeaf = pRoot.getM_pLeft() == null && pRoot.getM_pRight() == null;
if (currentSum == expectedSum && isLeaf){
System.out.println("A path is found:");
Iterator<Integer> it = path.iterator();
while(it.hasNext()){
System.out.print(it.next() + "\t");
}
System.out.println();
}
//如果不是叶结点,则遍历它的子节点
if (pRoot.getM_pLeft()!= null){
findPath_2(pRoot.getM_pLeft(), expectedSum, path, currentSum);
}
if (pRoot.getM_pRight()!=null){
findPath_2(pRoot.getM_pRight(), expectedSum, path, currentSum);
}
// 在返回到父结点之前,在路径上删除当前结点,
// 并在currentSum中减去当前结点的值
currentSum -= pRoot.getM_nValue();
path.pop();
}
// ====================测试代码====================
public static void Test(String testName, BinaryTreeNode pRoot, int expectedSum)
{
if(testName != null)
System.out.println(testName+" begins:");
findPath_1(pRoot, expectedSum);
System.out.println();
}
// 10
// / \
// 5 12
// /\
// 4 7
// 有两条路径上的结点和为22
public static void Test1()
{
BinaryTreeNode pNode10 = new BinaryTreeNode(10);
BinaryTreeNode pNode5 = new BinaryTreeNode(5);
BinaryTreeNode pNode12 = new BinaryTreeNode(12);
BinaryTreeNode pNode4 = new BinaryTreeNode(4);
BinaryTreeNode pNode7 = new BinaryTreeNode(7);
pNode10.connectTreeNodes(pNode5, pNode12);
pNode5.connectTreeNodes(pNode4, pNode7);
System.out.println("Two paths should be found in Test1.");
Test("Test1", pNode10, 22);
pNode10 = null;
}
// 10
// / \
// 5 12
// /\
// 4 7
// 没有路径上的结点和为15
public static void Test2()
{
BinaryTreeNode pNode10 = new BinaryTreeNode(10);
BinaryTreeNode pNode5 = new BinaryTreeNode(5);
BinaryTreeNode pNode12 = new BinaryTreeNode(12);
BinaryTreeNode pNode4 = new BinaryTreeNode(4);
BinaryTreeNode pNode7 = new BinaryTreeNode(7);
pNode10.connectTreeNodes(pNode5, pNode12);
pNode5.connectTreeNodes(pNode4, pNode7);
System.out.println("No paths should be found in Test2.");
Test("Test2", pNode10, 15);
pNode10 =null;
}
// 5
// /
// 4
// /
// 3
// /
// 2
// /
// 1
// 有一条路径上面的结点和为15
public static void Test3()
{
BinaryTreeNode pNode5 = new BinaryTreeNode(5);
BinaryTreeNode pNode4 = new BinaryTreeNode(4);
BinaryTreeNode pNode3 = new BinaryTreeNode(3);
BinaryTreeNode pNode2 = new BinaryTreeNode(2);
BinaryTreeNode pNode1 = new BinaryTreeNode(1);
pNode5.connectTreeNodes(pNode4, null);
pNode4.connectTreeNodes(pNode3, null);
pNode3.connectTreeNodes(pNode2, null);
pNode2.connectTreeNodes(pNode1, null);
System.out.println("One path should be found in Test3.");
Test("Test3", pNode5, 15);
pNode5 = null;
}
// 1
// \
// 2
// \
// 3
// \
// 4
// \
// 5
// 没有路径上面的结点和为16
public static void Test4()
{
BinaryTreeNode pNode1 = new BinaryTreeNode(1);
BinaryTreeNode pNode2 = new BinaryTreeNode(2);
BinaryTreeNode pNode3 = new BinaryTreeNode(3);
BinaryTreeNode pNode4 = new BinaryTreeNode(4);
BinaryTreeNode pNode5 = new BinaryTreeNode(5);
pNode1.connectTreeNodes(null, pNode2);
pNode2.connectTreeNodes(null, pNode3);
pNode3.connectTreeNodes(null, pNode4);
pNode4.connectTreeNodes(null, pNode5);
System.out.println("No paths should be found in Test4.");
Test("Test4", pNode1, 16);
pNode1 = null;
}
// 树中只有1个结点
public static void Test5()
{
BinaryTreeNode pNode1 = new BinaryTreeNode(1);
System.out.println("One path should be found in Test5.");
Test("Test5", pNode1, 1);
pNode1 = null;
}
// 树中没有结点
public static void Test6()
{
System.out.println("No paths should be found in Test6.");
Test("Test6", null, 0);
}
public static void main(String[] args)
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
}
}
 
结果输出:
Two paths should be found in Test1.
Test1 begins:
A path is found:
10 5 7
A path is found:
10 12
 
No paths should be found in Test2.
Test2 begins:
 
One path should be found in Test3.
Test3 begins:
A path is found:
5 4 3 2 1
 
No paths should be found in Test4.
Test4 begins:
 
One path should be found in Test5.
Test5 begins:
A path is found:
1
 
No paths should be found in Test6.
Test6 begins:

P143、面试题25:二叉树中和为某一值的路径的更多相关文章

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

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

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

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

  3. 【剑指Offer】面试题34. 二叉树中和为某一值的路径

    题目 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / ...

  4. 《剑指offer》面试题34. 二叉树中和为某一值的路径

    问题描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 ...

  5. 剑指offer 25 二叉树中和为某一值的路径

    非递归方法: class Solution { public: vector<vector<int>> FindPath(TreeNode* root,int expectNu ...

  6. 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径

    题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...

  7. 剑指Offer面试题:23.二叉树中和为某一值的路径

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

  8. 《剑指offer》第三十四题(二叉树中和为某一值的路径)

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

  9. 剑指offer 二叉树中和为某一个值的路径

    剑指offer 牛客网 二叉树中和为某一个值的路径 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 15:53:58 2 ...

  10. [PHP]算法-二叉树中和为某一值的路径的PHP实现

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

随机推荐

  1. HDU1857题解(逆向思维trie)

    题目link:http://acm.hdu.edu.cn/showproblem.php?pid=1857 先简述一下题目: 有一个RXC的字母矩形,R,C在500内,要匹配m个单词,m在100000 ...

  2. [原创] linux课堂-学习笔记-课程3.Linux目录结构介绍及内核与shell分析

    一.目录说明 1.1 bin 一般用户,可执行的系统内置命令 1.2 sbin 系统管理员,可执行的系统内置命令 1.3 boot 启动文件目录,启动有关的文件都保存在此 1.4 dev 设备管理文件 ...

  3. Android开发技巧:像QQ一样输入表情图像

     EditText和TextView一样,也可以进行图文混排.所不同的是,TextView只用于显示图文混排效果,而EditText不仅可显示, 也可混合输入文字和图像,让我们先回顾一下图5.2所示的 ...

  4. aix 安装redis

    下载最新rpm安装包 http://www.perzl.org/aix/index.php?n=Main.Redis # uname -aAIX rhjf 1 6 00C5CC964C00# pwd/ ...

  5. laravel方法汇总详解

    1.whereRaw() 用原生的SQL语句来查询,whereRaw('select * from user') 就和 User::all()方法是一样的效果 2.whereBetween() 查询时 ...

  6. Delphi代码优化

    文章编目 1. 字符串优化 1.1. 不重复初始化 1.2. 使用SetLength预分配长字符串(AnsiString) 1.3. 字符串与动态数组的线程安全(Thread Safety) 1.4. ...

  7. xml学习总结(四)

    命名空间 (1)产生 问题:在不同的约束文档中,有不同好安逸的相同标记名称 解决办法 每个约束模式人当被赋予一个唯一的名称空间,每个名称空间可用一个唯一的URI表示 在XML实例中为来自不同模式文档的 ...

  8. 遍历字典时用与不用iter的区别

    遍历字典时用与不用iter的区别 遍历字典的时候一般会用这三个方法:keys(),values(),items() 同时,它们各自都有升级版的方法:iterkeys(),itervalues(),it ...

  9. SIM900A访问HTTP的简单方法

    最近做项目,使用Arduino控制设备,读取数据,然后通过移动网络传送到服务器. 我选用的是正点原子的SIM900A模块.在服务器部署了一个监听程序,Arduino控制SIM900A通过TCP方式把数 ...

  10. Inside of Jemalloc

    INSIDE OF JEMALLOCThe Algorithm and Implementation of Jemalloc author: vector03mail:   mmzsmm@163.co ...