void PostOrder(BiTree){ // 全篇❤
InitStack(s);
BiTree *p=T,*r=NULL; // r标记最近访问过的结点
while(p!=NULL || !IsEmpty(s)){
if(p!=NULL){
push(s,p); // 一直向左走,左孩子入栈
p=p->lchild;
}
else{
GetTop(s,p);
// 获取s的栈顶元素赋值给p
// GetTop(s,p)意思就是判断栈顶元素的情况
//❤case one❤
if(p->rchild && p->rchild!=r){
// 若右孩子存在且未被访问
p=p->rchild; // 就让右孩子
push(s,p) // 入栈
p=p->lchild; // 让右孩子向左
//上面三句意思就是让右孩子的左孩子一直入栈,一直向左走
}
// ❤case two❤
else{
pop(s,p); // 右孩子为空或未被访问过,就出栈
visit(p->data);
r=p; // r标记最近访问结点
p=NULL; // r置空
// 置空原因:因为这个结点已经出栈了
//继续指向就没必要了,置空后r不标记任何结点
}
}
}
}
后序遍历非递归的详细解释
于 2022-11-24 14:32:05 首次发布