二叉树的后序遍历算法是按照左子树->右子树->节点的访问顺序来遍历二叉树的。所以需要将节点依次入栈,然后分别找到他们的左子树和右子树。而且在右子树没有被访问完之前,节点要一直在栈中。所以,当我们访问左子树后根据节点去访问右子树,而当右子树访问完后访问节点退栈,两次访问节点结果却不相同,如下图:
一个是访问节点后去访问右子树,一个是访问节点后退栈访问上一个节点的右子树如果不做任何处理,那么会在右子树访问后形成死循环,所以应添加一个标致位标致访问节点时应访问的位置(先序遍历和中序遍历并不需要,因为他们在访问右子树之前就已经将节点出栈了)。
首先定义栈元素类型:

一个是访问节点后去访问右子树,一个是访问节点后退栈访问上一个节点的右子树如果不做任何处理,那么会在右子树访问后形成死循环,所以应添加一个标致位标致访问节点时应访问的位置(先序遍历和中序遍历并不需要,因为他们在访问右子树之前就已经将节点出栈了)。
首先定义栈元素类型:
typedef struct {
struct BiTNode *ptr; // 二叉树结点的指针类型
int tag; // 0..1
} SElemType; // 栈的元素类型
二叉树节点类型:
typedef struct BiTNode {
TElemType data;