/*
试写出非递归的后序遍历算法
分析:
非递归的后续遍历较中序和先序而言,稍微复杂一点,首先我们需要一直从根节点往下寻找左孩子并入栈,之后访问栈顶元素,
并判断是否有右孩子,如果有右孩子入栈,并继续往左孩子找,直到某节点为单节点,出栈并访问。需要注意的是因为有可能一个节点我们
会访问多次,所以我们设置一个指针r用来表示上一次被访问过得节点
*/
struct biTree {//树的结构体
char data;
struct biTree *lchild;
struct biTree *rchild;
};
struct Stack {//栈的结构体
biTree** arr; //内存首地址
int len; //栈的容量
int top; //栈的下标
};
#include <stdio.h>
#include <stdlib.h>
void postOrder(biTree *T, Stack *s) {//后序遍历
biTree *p = T;
biTree *r = (struct biTree*)malloc(sizeof(struct biTree));
bool empty(Stack *);
bool push(Stack *, biTree *);
biTree *top(Stack *);
bool pop(Stack *);
while (p || !empty(s)) {
if (p) {//一路向左
push(s, p);
p = p->lchild;
}
else {
p = top(s);
if (p->rchild&&r != p->rchild) {
p = p->rchild;
push(s, p);
p = p->lchild;
}
else {
printf("%c ", p->data);//打印栈顶元素
r = p;
pop(s);//栈顶元素出栈
p = NULL;//这里一定要将p设为NULL,因为p的孩子已经遍历过了,不设置为NUll的话,又会将左孩子压入栈
}
}
}
}
int main() {
int count = 0;
struct biTree *T = (struct biTree *)malloc(sizeof(struct biTree));
struct Stack *s = (struct Stack*)malloc(sizeof(struct Stack));
biTree *create(biTree*);
void nodeNum(biTree *, int *);
Stack *createStack(int);
T = create(T);
nodeNum(T, &count);
s = createStack(count);//创建二叉树节点个数大小的栈
postOrder(T, s);
return 0;
}