二叉链表输出二叉树中从每个叶子结点到根节点的路径

#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;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值