目录
前言
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) {