zoukankan      html  css  js  c++  java
  • 九度oj 题目1368:二叉树中和为某一值的路径

    题目描述:

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

    输入:

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

    考察数据结构,但题目中有许多坑。
    一是按字典顺序输出。 用深搜顺序解决。
    二是路径指的是根节点到叶子节点。 加上判断。

    代码如下
     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <iostream>
     4 
     5 using namespace std;
     6 
     7 struct Node{
     8     int value;
     9     int left;
    10     int right;
    11 };
    12 
    13 Node tree[10002];
    14 
    15 int path[10002];
    16 int n, k;
    17 
    18 void dfs(int n, int sum, int step) {
    19     
    20     int l = tree[n].left;
    21     int r = tree[n].right;
    22     
    23     if(sum == k && l == -1 && r == -1) {
    24         printf("A path is found:");
    25         for(int i = 0; i < step; i++) {
    26             printf(" %d",path[i]);
    27         }
    28         puts("");
    29         return;
    30     }
    31     
    32     int p1 = min(l,r);
    33     int p2 = max(l,r);
    34     
    35     if(p1 != -1) {
    36         path[step] = p1;
    37         int v = tree[p1].value;
    38         dfs(p1, sum+v, step+1);
    39     }
    40     if(p2 != -1) {
    41         path[step] = p2;
    42         int v = tree[p2].value;
    43         dfs(p2, sum+v, step+1);
    44     }
    45 }
    46 
    47 
    48 int main(int argc, char const *argv[])
    49 {
    50     //freopen("input.txt","r",stdin);
    51     while(scanf("%d %d",&n,&k) != EOF) {
    52         for(int i = 1; i <= n; i++) {
    53             scanf("%d %d %d",&tree[i].value, &tree[i].left, &tree[i].right);    
    54         }
    55         path[0] = 1;
    56         int v = tree[1].value;
    57         puts("result:");
    58         dfs(1, v, 1);
    59         
    60     }    
    61     return 0;
    62 }
  • 相关阅读:
    Windows PE导出表编程3(暴力覆盖导出函数)
    Windows PE导出表编程3(暴力覆盖导出函数)
    Windows PE导出表编程2(重组导出表函数地址)
    Windows PE导出表编程2(重组导出表函数地址)
    Windows核心编程 第二十章 DLL的高级操作技术
    Windows核心编程 第二十章 DLL的高级操作技术
    Windows核心编程 第十九章 DLL基础
    CodeForces A. Points in Segments
    PAT 甲级 1031 Hello World for U
    PAT L1-006 连续因子
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5810017.html
Copyright © 2011-2022 走看看