题目1368:二叉树中和为某一值的路径
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2781
解决:703
-
题目描述:
-
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
-
输入:
-
每个测试案例包括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 3 2,要让它变成1 2 3) , 输出格式不要错,尤其是单词要对上, 要预留10000个节点的空间,一定要>=10000个,不然最后一个实例通不过的, 下面上代码
-
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <malloc.h> #define MAX 10001 int B[MAX] = { 0 }, kk = 0; int k; typedef struct nodetree { int data; int num; struct nodetree *left, *right; }nodetree; void init(nodetree *A[]) { for (int i = 1; i < MAX; i++) { A[i] = (nodetree*)malloc(sizeof(nodetree)); A[i]->left = NULL; A[i]->right = NULL; A[i]->num = -1; } return; } void print() { int i = 0; printf("A path is found: "); for (i = 0; i < kk - 1; i++) { printf("%d ", B[i]); } printf("%d\n", B[kk - 1]); } void travel(nodetree *A, int sum) { if (A) { B[kk++] = A->num; sum += A->data; travel(A->left, sum); travel(A->right, sum); if (sum == k && A->left == NULL&&A->right == NULL) { print(); } kk--; sum -= A->data; } } void fun(nodetree*& T) { if (T) { if (((T)->left && (T)->right) && (T)->left->num >(T)->right->num) { nodetree *p = (T)->left; (T)->left = (T)->right; (T)->right = p; } fun((T)->left); fun((T)->right); } } int main() { int n; while (scanf("%d%d", &n, &k) != EOF) { nodetree *A[MAX]; init(A); int sum = 0; for (int i = 1; i <= n; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); A[i]->data = a; A[i]->num = i; if (b != -1) A[i]->left = A[b]; if (c != -1) A[i]->right = A[c]; } fun(A[1]); printf("result:\n"); travel(A[1], 0); } return 0; }