二叉树的遍历算法(递归和非递归)

本文详细介绍了二叉树的前序、中序和后序遍历算法,并提供了递归和非递归两种实现方式的代码示例。递归实现直观易懂,而非递归实现则利用栈来替代递归调用,适用于资源受限的环境。

二叉树的遍历

1.递归实现

void PreOrder(BiTree T)
{
    if(T!=NULL)
    {
        printf("%d ",T->data);
        PreOrder(T->lchlid);
        PreOrder(T->rchlid);
    }
}
void InOrder(BiTree T)
{
    if(T!=NULL)
    {
        InOrder(T->lchlid);
        printf("%d ",T->data);
        InOrder(T->rchlid);
    }
}
void PostOrder(BiTree T)
{
    if(T!=NULL)
    {
        PostOrder(T->lchlid);
        PostOrder(T->rchlid);
        printf("%d ",T->data);
    }
}

2.非递归实现

前序遍历

void _PreOrder(BiTree T)
{
    BiTree p=T; top=-1;
    Stack[++top]=p;
    while(top>=0)
    {
        p=Stack[top--];
        printf("%d ",p->data);
        if(p->rchlid)   Stack[++top]=p->rchlid;
        if(p->lchlid)   Stack[++top]=p->lchlid;
    }
}

中序遍历

void _InOrder(BiTree T)
{
    BiTree p=T; top=-1;
    while(p||top>=0)
    {
        if(p)
        {
            Stack[++top]=p;
            p=p->lchlid;
        }
        else
        {
            p=Stack[top--];
            printf("%d ",p->data);
            p=p->rchlid;
        }
    }
}

后序遍历

void _PostOrder(BiTree T)
{
    BiTree p=T,r=NULL;
    top=-1;
    while(p||top>=0)
    {
        if(p)
        {
            Stack[++top]=p;
            p=p->lchlid;
        }
        else
        {
            p=Stack[top];
            if(p->rchlid&&p->rchlid!=r)
            {
                p=p->rchlid;
            }
            else
            {
                top--;
                printf("%d ",p->data);
                r=p;
                p=NULL;
            }
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值