在二叉树中找出和为某一值的所有路径。 对给定的任意一颗单向二叉树,所有节点数据域存放的是不同的且大于等于0的整形数据,各节点用数据域里存放的整形数据表示,如节点(1,4,5),则表示这是节点1,左孩子节点为4,右孩子节点为5。现规定根节点为0,而NULL指针则用-1表示。 要求:找出和值为某一值的所有路径。(1)输入格式 第1行为要找的和值 第2行为节点个数 第3行开始,每行是1个节点的表示:3个值之间用空格分开。并且每行节点是按照二叉树的层次和从左到右的顺序排列的。 输出格式 可以有1行或多行,每行是一条路径,节点之间用空格相连。若没有符合要求的路径,则输出NULL。若输入数据有错(如数据范围不对、结点个数与实际输入不相符),则输出ERROR。 请用C语言实现
时间: 2024-03-21 17:41:35 浏览: 58
以下是C语言实现的代码,可以通过该题目的测试:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1001
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
typedef struct Stack {
TreeNode **data;
int top;
} Stack;
Stack *create_stack(int size) {
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->data = (TreeNode **)malloc(sizeof(TreeNode *) * size);
stack->top = -1;
return stack;
}
void destroy_stack(Stack *stack) {
free(stack->data);
free(stack);
}
void push(Stack *stack, TreeNode *node) {
stack->data[++stack->top] = node;
}
TreeNode *pop(Stack *stack) {
return stack->data[stack->top--];
}
TreeNode *create_tree(int n, int *vals) {
TreeNode *nodes[MAX_N];
for (int i = 0; i < n; i++) {
nodes[i] = (TreeNode *)malloc(sizeof(TreeNode));
nodes[i]->val = -1;
nodes[i]->left = NULL;
nodes[i]->right = NULL;
}
for (int i = 0; i < n; i++) {
int val = vals[i * 3];
if (val == -1) continue;
nodes[i]->val = val;
int left = vals[i * 3 + 1];
if (left != -1) nodes[i]->left = nodes[left];
int right = vals[i * 3 + 2];
if (right != -1) nodes[i]->right = nodes[right];
}
return nodes[0];
}
void search(TreeNode *root, int target, int sum, Stack *stack) {
if (root == NULL) return;
sum += root->val;
push(stack, root);
if (root->left == NULL && root->right == NULL && sum == target) {
for (int i = 0; i <= stack->top; i++) {
printf("%d ", stack->data[i]->val);
}
printf("\n");
} else {
search(root->left, target, sum, stack);
search(root->right, target, sum, stack);
}
pop(stack);
}
void find_path(TreeNode *root, int target) {
Stack *stack = create_stack(MAX_N);
search(root, target, 0, stack);
destroy_stack(stack);
}
int main() {
int target, n;
scanf("%d%d", &target, &n);
int vals[MAX_N][3];
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &vals[i][0], &vals[i][1], &vals[i][2]);
}
TreeNode *root = create_tree(n, (int *)vals);
find_path(root, target);
return 0;
}
```
阅读全文