zoukankan      html  css  js  c++  java
  • 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径

    题目链接地址:
    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("
    ");
            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:
    ");
            dfs(0,sum,1);
        }
        return 0;
    }
    
    /**************************************************************
        Problem: 1368
        Language: C++
        Result: Accepted
        Time:30 ms
        Memory:1140 kb
    ****************************************************************/
    
  • 相关阅读:
    lucene复合条件查询案例——查询name域 或 description域 包含lucene关键字的两种方式
    谈谈你对spring的理解?
    模拟Http请求的几种常用方式
    idea破解教程
    Pycharm 或者 idea 注册码 (亲测可用)
    超详细虚拟机工具和Centos7 Linux系统安装
    严重: Error loading WebappClassLoader context:异常的解决方法(转)
    spring cloud 笔记记录
    近一周学习之-----vue学习快乐之旅(1)
    近一周学习之-----vue开发工具visual studio code
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7239176.html
Copyright © 2011-2022 走看看