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


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

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    题目描述:

    输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

    输入:

    每个测试案例包括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:


    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <map>
    #include <vector>
    #include <set>
    #include <algorithm>
    #include <vector>
    #include <stack>
    #include <math.h>
    #include <stdlib.h>
    #include <fstream>
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std;
    typedef long long LL ;
    const int size=10008 ;
    struct Me{
       struct Node{
          int left ;
          int right ;
       };
       Node node[size] ;
       int num[size] ;
       int ans[size] ;
       int N ,K;
       Me(){} ;
       Me(int n,int k):N(n),K(k){
           for(int i=1;i<=N;i++)
             node[i].left=node[i].right=0 ;
       };
       void read(){
           int L ,R;
           for(int i=1;i<=N;i++){
               scanf("%d%d%d",&num[i],&L,&R) ;
               if(L>R)
                 swap(L,R) ;
               if(L!=-1)
                  node[i].left=L ;
               if(R!=-1)
                  node[i].right=R ;
           }
       }
       void dfs(int id ,int sum ,int select){
           if(node[id].left==0&&node[id].right==0){
               if(sum==K){
                    //ok
                   printf("A path is found:") ;
                   for(int i=0;i<select;i++)
                        printf(" %d",ans[i]) ;
                   puts("") ;
               }
               return ;
           }
           if(sum>K)
              return ;
           if(node[id].left){
               ans[select]= node[id].left ;
               dfs(node[id].left,sum+num[node[id].left],select+1) ;
           }
           if(node[id].right){
               ans[select]= node[id].right ;
               dfs(node[id].right,sum+num[node[id].right],select+1 ) ;
           }
       }
       int gao(){
            read() ;
            puts("result:")   ;
            ans[0]=1 ;
            dfs(1,num[1],1) ;
       }
    };
    int main(){
       int n , k;
       while(scanf("%d%d",&n,&k)!=EOF){
            Me me(n,k) ;
            me.gao() ;
       }
       return 0 ;
    }
    

      

  • 相关阅读:
    filter in the new axis?
    项目 ".wdproj "所需的应用程序未安装。确保已安装项目类型(.wdproj)的应用程序
    firefox的webmail notifier网易邮箱设置
    phpmyadmin导出数据中文乱码问题解决
    Eclipse快捷键大全(转载)
    Android Error: Unable to open class file R.java
    将 SQL Server Express 版用于 ASP.NET (Visual Studio)
    MySql常用命令
    Godaddy Google Adwords 促销代码使用
    HTTP 错误 500.22 Internal Server Error—IIS7 Asp.net2.0 网站运行失败解决办法
  • 原文地址:https://www.cnblogs.com/liyangtianmen/p/3306489.html
Copyright © 2020-2023  润新知