C语言经典算法之二叉树的前序遍历(非递归实现)

本文介绍了在C语言中非递归方式实现二叉树前序遍历的方法,探讨了其时间复杂度为O(n),空间复杂度取决于树结构,同时分析了非递归实现的优点(如空间效率和代码可移植性)和缺点(如代码复杂度和空间消耗)。文中还提到这种遍历在现实世界中的多种应用场景,如文件系统、表达式解析等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

A.建议

B.简介

一 代码实现

二 时空复杂度

A.时间复杂度(Time Complexity):

B.空间复杂度(Space Complexity):

三 优缺点

A.优点:

B.缺点:

C.总结

四 现实中的应用


前言

A.建议

1.学习算法最重要的是理解算法的每一步,而不是记住算法。

2.建议读者学习算法的时候,自己手动一步一步地运行算法。

tips:文中的(如果有)对数,则均以2为底数

B.简介

在C语言中,二叉树的前序遍历(根-左-右)非递归实现通常使用栈来辅助。

一 代码实现

#include <stdio.h>
#include <stdlib.h>

// 定义二叉树节点结构体
typedef struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

// 前序遍历非递归函数
void preorderTraversalNonRecursive(TreeNode* root) {
    if (root == NULL) return; // 如果根节点为空,则结束遍历

    // 初始化一个栈
    TreeNode *stack[1000]; // 假设二叉树深度不会超过1000
    int top = -1;

    // 将根节点压入栈中,并访问它
    stack[++top] = root;
    printf("%d ", root->val);

    while (top != -1) {
        // 弹出栈顶元素并检查其右孩子
        TreeNode *node = stack[top--];
        if (node->right) {
            // 先将右孩子压入栈中(因为前序是先访问左子树)
            stack[++top] = node->right;
            printf("%d ", node->right->val);
        }

        // 然后检查该节点是否有左孩子,如果有则压入栈中
        if (node->left) {
            stack[++top] = node->left;
            printf("%d ", node->left->val);
        }
    }
}

// 创建二叉树节点的辅助函数(这里省略)

int main() {
    // 创建二叉树(这里假设已经创建了根节点)

    // 调用前序遍历函数
    preorderTraversalNonRecursive(root);

    return 0;
}

请注意,在上述代码中,为了简化问题&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JJJ69

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值