【剑指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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 理财平台跑路了怎么办 联通4g信号不好怎么办 老年人耳朵嗡嗡响什么原因怎么办 单侧耳朵嗡嗡响怎么办 蚊子钻到耳朵里怎么办 小飞虫进耳朵里怎么办 耳朵里飞进去虫怎么办 耳朵里进虫子了怎么办 耳朵进虫子了怎么办啊 耳朵里进了蚊子怎么办 有虫子爬进耳朵怎么办 虫子死在耳朵里怎么办 早上起床口苦口臭怎么办 耳朵被耳屎堵了怎么办 油耳朵被堵住了怎么办 棉签掏耳朵堵了怎么办 耳朵被气堵住了怎么办 掏耳朵发炎了疼怎么办 掏耳朵掏深了疼怎么办 耳朵里进了虫子怎么办? 耳朵里飞进小虫怎么办 一只耳朵听力差怎么办 62岁耳朵有点聋怎么办 一支耳朵有点聋怎么办 80岁老人耳朵聋怎么办 被nlp课程洗脑了怎么办 手上张了个鸡眼怎么办 手上长了个鸡眼怎么办 6岁儿童手指脱皮怎么办 手指骨折后关节僵硬怎么办 手指外伤后关节肿大僵硬怎么办 胳膊骨折了手肿怎么办 耳朵被肘了耳鸣怎么办 耳朵鼓膜外显的怎么办 耳膜破了怎么办为好 耳朵的鼓膜破了怎么办 被打耳鼓膜穿孔怎么办 两只耳朵嗡嗡响怎么办 耳朵长了个脓包怎么办 胸一个大一个小怎么办 把耳朵掏出血了怎么办