【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
来源:互联网 发布:出售淘宝买家手机号码 编辑:程序博客网 时间:2024/05/16 06:15
题目链接地址:
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****************************************************************/
1 0
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
- 【剑指offer】面试题25:二叉树中和为某一值的路径
- 剑指Offer:面试题25 二叉树中和为某一值的路径
- 剑指offer 面试题25 求二叉树中和为某一路径的值
- 《剑指Offer》面试题25:二叉树中和为某一值的路径
- 剑指offer 面试题25—二叉树中和为某一值的路径
- 剑指offer--面试题25:二叉树中和为某一值的路径--Java实现
- 【剑指Offer学习】【面试题25:二叉树中和为某一值的路径】
- 剑指Offer面试题25(Java版):二叉树中和为某一值的路径
- 剑指offer面试题25-二叉树中和为某一值的路径
- 剑指offer-面试题25:二叉树中和为某一值的路径
- 剑指offer面试题之二叉树中和为某一值的所有路径
- 剑指offer-面试题25.二叉树中和为某一值的路径
- 剑指offer面试题 二叉树中和为某一值的路径
- 剑指offer之面试题25:二叉树中和为某一值的路径
- 剑指Offer----面试题25:二叉树中和为某一值的路径
- 剑指offer-面试题25:二叉树中和为某一值的路径
- 剑指offer面试题25:二叉树中和为某一值的路径
- Node.js初体验之入门(二)
- websocket
- Android图片下载缓存库picasso解析
- Android 编程下 Touch 事件的分发和消费机制
- Vim学习笔记
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
- js上传文件
- 【翻译自mos文章】recover.bsq文件在数据库软件安装光盘的哪个位置?
- TCP的SACK选择确认选项
- Oozie4.2 安装部署、以及example测试
- 【练习笔记】剑指offer-面试题8 :旋转数组的最小数字
- Android Adapter优化问题
- 初试贪心nyoj6喷水装置(一)
- 显示调用c++动态链接库