题目链接地址:

http://ac.jobdu.com/problem.php?

pid=1368

题目1368:二叉树中和为某一值的路径

时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252解决:562

题目描写叙述:

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的全部路径。

路径定义为从树的根结点開始往下一直到叶结点所经过的结点形成一条路径。

输入:

每一个測试案例包含n+1行:

第一行为2个整数n。k(1<=n<=10000)。n表示结点的个数。k表示要求的路径和。结点编号从1到n。

接下来有n行。这n行中每行为3个整数vi,leftnode,rightnode。vi表示第i个结点的值。leftnode表示第i个结点的左孩子结点编号,rightnode表示第i个结点的右孩子结点编号。若无结点值为-1。编号为1的结点为根结点。

输出:

相应每一个測试案例。先输出“result:”占一行,接下来按字典顺序输出满足条件的全部路径,这些路径由结点编号组成,输出格式參照输出例子。

例子输入:

5 22

10 2 3

5 4 5

12 -1 -1

4 -1 -1

7 -1 -1

1 5

1 -1 -1

例子输出:

result:

A path is found: 1 2 5

A path is found: 1 3

result:


思路分析:

DFS遍历,vector存储路径,sum记录路径和。採用回溯的方法进行节点的输出。

时间复杂度O(n)。

遍历过程中须要存储路径。vector的空间复杂度为O(log(n))。


代码:

/*********************************
【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
Author:牧之丶 Date:2015年
Email:bzhou84@163.com
**********************************/
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <stack>
#include <vector>
#include<queue>
using namespace std; struct Node
{
int value;
int lchild;
int rchild;
}nodes[10005]; vector<int> result;
void dfs(int count,int sum,int i)
{
if(i==-1)
return ;
if(sum==count+nodes[i].value&&nodes[i].lchild==-1&&nodes[i].rchild==-1)
{
result.push_back(i);
printf("A path is found:");
for(int j=0;j<result.size();j++)
printf(" %d",result[j]);
printf("\n");
result.pop_back();
return;
}
if(sum>count+nodes[i].value)
{
result.push_back(i);
dfs(count+nodes[i].value,sum,nodes[i].lchild);
dfs(count+nodes[i].value,sum,nodes[i].rchild);
result.pop_back();
}
}
int main()
{
int num,sum;
//freopen("data.in","r",stdin);
while(scanf("%d%d",&num,&sum)!=EOF)
{
result.clear();
for(int i=1;i<=num;i++)
{
scanf("%d%d%d",&nodes[i].value,&nodes[i].lchild,&nodes[i].rchild);
if(nodes[i].lchild>nodes[i].rchild)
{
int tmp=nodes[i].lchild;
nodes[i].lchild=nodes[i].rchild;
nodes[i].rchild=tmp;
}
}
printf("result:\n");
dfs(0,sum,1);
}
return 0;
} /**************************************************************
Problem: 1368
Language: C++
Result: Accepted
Time:30 ms
Memory:1140 kb
****************************************************************/

【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径的更多相关文章

  1. 《剑指offer》— JavaScript(24)二叉树中和为某一值的路径

    二叉树中和为某一值的路径 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 前序遍历二叉树, ...

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

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

  3. 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历

    二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...

  4. C++版-剑指offer 面试题6:重建二叉树(Leetcode105. Construct Binary Tree from Preorder and Inorder Traversal) 解题报告

    剑指offer 重建二叉树 提交网址: http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tq ...

  5. 剑指offer——面试题7:重建二叉树

    // 面试题7:重建二叉树 // 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输 // 入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1, // 2, ...

  6. 剑指Offer面试题:5.重建二叉树

    一.题目:重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序 ...

  7. 剑指offer 面试题6:重建二叉树

    重建二叉树 题目 输入某二叉树的前序遍历和中序遍历,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含有重复的数字. 例如,前序遍历序列:{1,2,3,7,3,5,6,8},中序遍历序列:{ ...

  8. 剑指offer面试题6:重建二叉树

    1.题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. public class Solution { public TreeNode reConstructBinaryTree(int ...

  9. 剑指offer——面试题26:判断二叉树B是否为二叉树A的子结构

    #include"iostream" #include"stdio.h" #include"math.h" using namespace ...

  10. 剑指offer 面试题7:重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

随机推荐

  1. hibernate注解配置举例说明

    Hibernate Annotation   (Hibernate 注解)   进入:http://www.hibernate.org 说明文档: 英文:http://docs.jboss.org/h ...

  2. HDU3232 Crossing Rivers 数学期望问题

    Crossing Rivers                                                                                     ...

  3. BZOJ 2243:染色(树链剖分+区间合并线段树)

    [SDOI2011]染色Description给定一棵有n个节点的无根树和m个操作,操作有2类:1.将节点a到节点b路径上所有点都染成颜色c:2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认 ...

  4. java.net.BindException: Permission denied

    端口号报错: 解决办法:把端口号改为1000以上的,比如8080

  5. JAVA简易的注册会员系统

    public class Login { public static void main(String[] args) { System.out.println("*****欢迎进入注册系统 ...

  6. ionic2 jpush

    ionic2 为ionic2调用极光插件提供符合angular2及TS的调用方式 install 先安装官方的cordova插件 $ cordova plugin add jpush-phonegap ...

  7. 【CCF】URL映射 模拟

    #include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...

  8. SQL统计,重复字段只算一次

    原文发布时间为:2010-08-07 -- 来源于本人的百度文章 [由搬家工具导入] master数据库为例: COUNT(EXPRESSION)一个字段重复,则只算一次:SELECT COUNT(D ...

  9. .NET返回上一页

    原文发布时间为:2010-05-25 -- 来源于本人的百度文章 [由搬家工具导入] if (Request.UrlReferrer != null)                {         ...

  10. XPath gramma

    XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. XML 实例文档 我们将在下面的例子中使用这个 XML 文档. & ...