#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 定义一个栈来存储路径
typedef struct Stack {
int top;
int maxSize;
int *array;
} Stack;
// 初始化栈
Stack* createStack(int size) {
Stack* stack = (Stack*)malloc(sizeof(Stack));
stack->maxSize = size;
stack->top = -1;
stack->array = (int*)malloc(stack->maxSize * sizeof(int));
return stack;
}
// 检查栈是否为空
int isEmpty(Stack* stack) {
return stack->top == -1;
}
// 压栈
void push(Stack* stack, int value) {
stack->array[++stack->top] = value;
}
// 出栈
int pop(Stack* stack) {
if (!isEmpty(stack))
return stack->array[stack->top--];
return -1; // 返回-1表示栈为空
}
// 释放栈
void freeStack(Stack* stack) {
free(stack->array);
free(stack);
}
// 递归函数,从叶子节点到根节点打印路径
void printPathsUtil(TreeNode* root, Stack* stack) {
// 如果节点为空,返回
if (root == NULL)
return;
// 将当前节点值压栈
push(stack, root->val);
// 如果当前节点是叶子节点,打印路径
if (root->left == NULL && root->right == NULL) {
for (int i = 0; i <= stack->top; i++)
printf("%d ", stack->array[i]);
printf("\n");
} else {
// 否则,递归遍历左子树和右子树
printPathsUtil(root->left, stack);
printPathsUtil(root->right, stack);
}
// 回溯,弹出当前节点值
pop(stack);
}
// 打印从叶子节点到根节点的所有路径
void printPaths(TreeNode* root) {
Stack* stack = createStack(100); // 假设二叉树深度不会超过100
printPathsUtil(root, stack);
freeStack(stack);
}
// 辅助函数:创建新节点
TreeNode* newNode(int val) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = node->right = NULL;
return node;
}
// 示例用法
int main() {
/* 构造二叉树
1
/ \
2 3
/ \
4 5
*/
TreeNode* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf("从叶子节点到根节点的路径:\n");
printPaths(root);
// 释放内存(示例中未释放所有节点,实际使用时需要添加释放函数)
return 0;
}
