题目链接地址:

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. 【转】Visual Studio 2013 Tools for Unity安装目录,Visual Studio 2013 Tools.unitypackage

    http://blog.csdn.net/dynastyting/article/details/46505349 Visual Studio 2013 Tools for Unity安装目录 D:\ ...

  2. 删除ARCSDE表空间和用户后,新建时出现error -1:O的解决办法

    对于刚开始使用arcsde的用户,可能会出现各种问题,慢慢来就会找到解决办法 当我们删除用户和表空间时,在服务器本地还保留这sde.dbf文件(删除时选择了删除本地文件,不知道为什么), 我们可以换一 ...

  3. chrome浏览器无法安装非应用商店插件的解决办法

    不久前,安装了一个非chrome应用商店的第三方应用,今天突然发现无法使用,打开chrome的扩展程序后,发现该插件以及被禁用,在网上查找了解决方法,设置“开发者模式”,修改了chrome的参数,仍然 ...

  4. C++ Essentials 之 lower_bound 和 upper_bound 的比较函数格式不同

    第一次注意到这个问题. cppreference 上的条目: lower_bound upper_bound C++17 草案 N4659 lower_bound template<class ...

  5. BZOJ2396 神奇的矩阵 【随机化 + 矩乘】

    题目链接 BZOJ2396 题解 一种快速判断两个矩阵是否相等的方法: 对于两个\(n * n\)矩阵,两边同时乘一个\(n * 1\)的随机矩阵,如果结果相等,那么有很大概率两个矩阵相等 如果左边是 ...

  6. iOS指向函数的指针和block

      一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是block得标志  好比*:是指针的标志 特点:1:保存一段代码: 2:可以有参数和返回值: 3:可以作 ...

  7. 1 - Django安装

    一.Python安装 在Mac系统下,系统自带python开发环境,打开终端,输入python,我们就可以看到当前python版本号,例如我的系统是OS X EI Caption 10.11.1,自带 ...

  8. TeamViewer下载地址

    http://www.teamviewer.com/zhCN/download/linux.aspx Ubuntu配置远程访问的xrdp协议和teamviewer软件 先启用远程设置:System-& ...

  9. android studio 按钮运行按钮后,不弹出选择运行模拟器的对话框

    这个问题实际上很简单,奈何碰到的时候做了很多无用功.clean,rebulid... 特此记录,方便后来人. 解决步骤: 1.关闭AndroidStudio,并重启. 2. 把截图中的地方的勾去掉.检 ...

  10. 16Aspx.com-将15位身份证转换成18位

    //********************************************************************************* //将15位身份证转换成18位时 ...