二:二叉树的递归与非递归遍历

本文详细介绍了如何使用递归和非递归方法来实现二叉树的前序、中序、后序遍历,并提供了相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以根结点的访问顺序纷飞前,中,后序


1. 前序遍历:


递归:

void PreOrder(BiTree *root)

{

   if(root!=NULL)

    {

       cout<<root->data<<" ";

        PreOrder(root->lchild);

        PreOrder(root->rchild);

    }

}

 

非递归:

voidPreOrder (BiTree *root) 

{

    stack<BiTree*> s;

    BiTree *p=root;

    while(p!=NULL||!s.empty())

    {

        while(p!=NULL)

        {

           cout<<p->data<<" ";

            s.push(p);

            p=p->lchild;

        }

        if(!s.empty())

        {

            p=s.top();

            s.pop();

            p=p->rchild;

        }

    }

}

 

2. 中序遍历:


递归:

voidInOrder (BiTree *root)

{

    if(root!=NULL)

    {

        InOrder (root->lchild);

        cout<<root->data<<"";

        InOrder (root->rchild);

    }

}


非递归:

voidInOrder (BiTree *root)      //非递归中序遍历

{

    stack<BiTree *> s;

    BiTree *p=root;

    while(p!=NULL||!s.empty())

    {

        while(p!=NULL)

        {

            s.push(p);

            p=p->lchild;

        }

        if(!s.empty())

        {

            p=s.top();

           cout<<p->data<<" ";

            s.pop();

            p=p->rchild;

        }

    }   

}


3. 后序遍历:


递归:

voidPostOrder(BiTree *root)  

{

    if(root!=NULL)

    {

        PostOrder(root->lchild);

        PostOrder (root->rchild);

        cout<<root->data<<"";

    }   

}


非递归:

在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子前访问才能访问根结点。因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。


voidPostOrder(BiTree *root)   

{

    stack<BiTree*> s;

    BiTree *cur;                      //当前结点

    BiTree *pre=NULL;                 //前一次访问的结点

    s.push(root);

    while(!s.empty())

    {

        cur=s.top();

       if((cur->lchild==NULL&&cur->rchild==NULL)||

           (pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))

        {

           cout<<cur->data<<" ";  //如果当前结点没有孩子结点或者孩子节点都已被访问过

              s.pop();

            pre=cur;

        }

        else

        {

            if(cur->rchild!=NULL)

                s.push(cur->rchild);

            if(cur->lchild!=NULL)   

                s.push(cur->lchild);

        }

    }   

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值