/* 用于后根遍历使用,添加tag在栈中判断, 当tag为0时,表示当前节点为根的左子树已经入栈,右子树还未入栈, 当tag为1时,表示当前节点为根的左右子树均已入栈,可以访问 */
struct bitree_node_tag_t
{
struct bitree_node_t *node;
int tag;
};
/* 后根遍历整棵树 可以支持以root为根的树的遍历, 注意,root不一定为tree->root,也可为某个子树 */
int BiTreePostOrderTraverse(struct bitree_t *tree, struct bitree_node_t *root, BITREE_VISIT_CB visit)
{
struct bitree_node_tag_t stack[MAX_BITREE_DEPTH] = {0};
int top = -1;
struct bitree_node_tag_t *tagnode = NULL;
struct bitree_node_t *node = NULL;
if (NULL == tree)
{
return 0;
}
if (NULL == root)
{
root = tree->root;
if (NULL == root)
{
return 0;
}
}
/* 根节点入栈 */
node = root;
tagnode = &stack[++top];
tagnode->node = node;
tagnode->tag = 0;
while (top >= 0)
{
/* 左子树的左节点入栈 */
while (node && node->lchild)
{
node = node->lchild;
tagnode = &stack[++top];
tagnode->node = node;
tagnode->tag = 0;
}
tagnode = &stack[top];
node = tagnode->node;
if (tagnode->tag == 0 && node->rchild)
{
/* 右节点入栈时,当前节点tag设置为1 */
tagnode->tag = 1;
/* 右节点入栈 */
node = node->rchild;
tagnode = &stack[++top];
tagnode->node = node;
tagnode->tag = 0;
}
else
{
/* 当为叶子节点,或者左右子树均已经入栈过,则可访问当前节点 */
tagnode = &stack[top--];
node = tagnode->node;
visit(tree, node);
node = NULL;
}
}
return 0;
}