二叉树前序、中序、后序非递归遍历实现(C语言)

一、非递归前序遍历

void TreversePreorder(struct BTree *T)
{
    struct BTree *stack[1000],*p=T;
    int top=0;
    while(p||top)
    {
        if(p)
        {
            printf("%d ",p->data);
            stack[top++]=p;
            p=p->left;
        }
        else
        {
            p=stack[--top];
            p=p->right;
        }
    }
}

二、非递归中序遍历

void TreverseInorder(struct BTree *T)
{
    struct BTree *stack[1000],*p=T;
    int top=0;
    while(p||top)
    {
        if(p)
        {
            stack[top++]=p;
            p=p->left;
        }
        else
        {
            p=stack[--top];
            printf("%d ",p->data);
            p=p->right;
        }
    }
}

三、非递归后序遍历

void TreversePostorder(struct BTree *T)
{
    struct BTree *stack[1000],*p=T,*r=NULL;//r记录上一个已经访问节点
    int top=0;
    while(p||top)
    {
        if(p)
        {
            stack[top++]=p;
            p=p->left;
        }
        else
        {
            p=stack[top-1];
            if(p->right&&p->right!=r)//右子树不为空且未被访问则需要压栈
            {
                p=p->right;
                stack[top++]=p;//当前右子树压栈
                p=p->left;//p指向下一个将要访问的节点
            }
            else//右子树为空或者右子树已经被访问
            {
                p=stack[--top];
                printf("%d ",p->data);
                r=p;//r保存节点
                p=NULL;
            }
        }
    }
}

你可能感兴趣的:(树和二叉树)