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

目录

前言

A.建议

B.简介

二 代码实现

二 时空复杂度

A.时间复杂度:

B.空间复杂度:

C.总结:

三 优缺点

A.优点:

B.缺点:

四 现实中的应用


前言

A.建议

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

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

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

B.简介

在C语言中,二叉树的后序遍历(LRD顺序:左子树-右子树-根节点)非递归实现通常依赖于栈来模拟递归过程。

二 代码实现

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

// 定义二叉树结点结构体
typedef struct BiTNode {
    int data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

// 后序遍历非递归实现
void postOrderTraversal(BiTree T) {
    if (T == NULL) return;

    // 使用两个栈辅助遍历
    BiTree stack1[100], stack2[100];  // 假设数组足够大以容纳所有节点
    int top1 = -1, top2 = -1; 

    stack1[++top1] = T;  // 根节点入栈1

    while (top1 != -1) {
        BiTree p = stack1[top1];  // 弹出栈顶元素但不处理(即不输出)
        while (p != NULL) {  // 往右子树方向走
            stack1[++top1] = p;  // 当前节点入栈1
            p = p->rchild;  // 移动到右子节点
        }
        
        if (top1 == -1) break;  // 如果栈1为空,则结束遍历

        // 当前栈顶节点没有右孩子了,将其出栈并压入栈2
        BiTree temp = stack1[top1--];
        stack2[++top2] = temp;

        // 处理左子树
        p = stack1[top1];
        if (p != NULL && p->lchild != NULL) {
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JJJ69

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

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

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

打赏作者

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

抵扣说明:

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

余额充值