P143、面试题25:二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二叉树结点的定义如下:
struct BinaryTreeNode{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
}
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();
}
}
P143、面试题25:二叉树中和为某一值的路径的更多相关文章
- 剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)
问题描述: 输入一棵二叉树和一个整数,打印出二叉树中结点指的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.二叉树结点的定义如下: public class Tree ...
- 《剑指offer》面试题25 二叉树中和为某一值的路径 Java版
(判断是否有从根到叶子节点的路径,其和为给定值.记录这些路径.) 我的方法:这道题我是按照回溯的思路去做的,我们需要一个数据结构来保存和删除当前递归函数中添加的值.这里要打印一条路径,我们可以选择Li ...
- 【剑指Offer】面试题34. 二叉树中和为某一值的路径
题目 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / ...
- 《剑指offer》面试题34. 二叉树中和为某一值的路径
问题描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 ...
- 剑指offer 25 二叉树中和为某一值的路径
非递归方法: class Solution { public: vector<vector<int>> FindPath(TreeNode* root,int expectNu ...
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...
- 剑指Offer面试题:23.二叉树中和为某一值的路径
一.题目:二叉树中和为某一值的路径 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.例如输入下图中二叉树和整数2 ...
- 《剑指offer》第三十四题(二叉树中和为某一值的路径)
// 面试题34:二叉树中和为某一值的路径 // 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所 // 有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. #i ...
- 剑指offer 二叉树中和为某一个值的路径
剑指offer 牛客网 二叉树中和为某一个值的路径 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 15:53:58 2 ...
- [PHP]算法-二叉树中和为某一值的路径的PHP实现
二叉树中和为某一值的路径: 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的li ...
随机推荐
- Z-Stack ZMain学习
[注:本文源自博客园http://www.cnblogs.com/cherishui/,为尊重劳动者成果,如需转载请保留此行] 在TI已有的Z-Stack的工程下面,打开已有的demo文件,通过分析不 ...
- 布局—column(属性)
column-width:||用来定义多列中每列的宽度,用像素表示column-count:||用来定义多列中的列数,用数字来表示1-10columns: 200px 2||列宽和列数column-g ...
- firefox 自定义快捷键
firefox 更新到44或45,发现原来的更改快捷键的扩展没了!!!
- oracle创建表空间、用户
创建表空间 create tablespace '<数据库名>' datafile '<存储路径>' size 500M default storage (initial 20 ...
- 二、记一次失败的 CAS 搭建 之 证书配置
==================================================================================================== ...
- gridview 一个列勾选框选中,同时选中同一行的另一列勾选框
<asp:TemplateColumn > <HeaderTemplate> 是否显示 <asp:CheckBox ID="chk_Show" sty ...
- mac使用wget下载网站(仿站)
wget -c -r -np -k -L -p http://www.xxxx.com 参考 wget的安装 http://blog.csdn.net/ssihc0/article/details/7 ...
- CentOS安装配置Git服务器(gitosis)
主要参考: http://blog.csdn.net/dengjianqiang2011/article/details/9260435 辅助参考: http://freeloda.blog.51ct ...
- Js 处理将时间转换 “年-月-日”
将时间 \/Date(1432828800000+0800)\/" 转换成:“年-月-日” //时间转换function ChangeDateFormat(val) { if (v ...
- EXTJS 4.2 资料 控件之checkboxgroup的用法(动态数据)
在开发中遇到两种情况:第一在新增窗体时,要动态加载CheckBox项:第二在修改时不但需要加载所有CheckBox项,还要并且选中之前新增时的选项 如图这是在修改页面的效果: 1.在新增窗体中动态加载 ...