前言
声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出数据结构每日一题
相比先序和中序的非递归实现(差异只是在访问在入栈和出栈的先后顺序);
而后序的非递归实现则要复杂一点,因为后序的顺序是左右根的顺序,所以要对右子树进行判断;
判断条件有两个(同时满足) :
1.右子树是否为空
2.右子树是否被访问过
思想 (借助栈实现)
- 将沿着根的左孩子依次入栈,直达左孩子为空
- 判断右子树是否为空且是否被访问过,如果满足则对右子树重复 1 的操作
- 否则出栈,访问节点,且标记最近访问的节点,并置空
void PostOrder(BiTree T){
BiTree p =T ;//新建树对象,对树操作
//初始化栈
InitStack(S);
BNode *r=NULL;//用于标记最近被访问过的节点(判断条件中要用)
if(p){
push(S,p);
p=p->lchild;
}
else
//获取栈顶的元素p
GetTop(S,p);
//判断右子树是否为空,且最近是否被访问过
if(p->rchild && p->rchild != r){
p=p->rchild; //对右子树重复 1 的操作
push(S,p);
p=p->lchild;
}
//若右子树为空或被访问过则出栈
else{
pop(S,p);
visit(p); //访问
r=p; //记录最近访问过的节点
p=NULL;
}
}