二叉树遍历的非递归算法

  闲来无事,重看了《数据结构》一书,突然发现其中的很多代码写的很精妙,以下就是我对二叉树一部分的做的记录。一般遍历就是使用前序、中序、后序三种遍历,我自己平时都是使用递归算法,今天看书才发现递归算法不是最优解,因为函数调用栈层层叠加,还要保存函数的返回地址,实际参数传递,创建局部变量等等。

  一、二叉树前序非递归算法

    前序遍历的特点是:首先访问根,访问完根后再访问左子树,所以对每一个结点,在访问完该结点后,沿着左链访问下来 ,直到为左链为空,然后将所有访问过的结点进栈。然后结点出栈,每一个出栈的结点就是表示该结点和期左子树都已经被访问,那么开始访问该结点的右子树了。

    步骤如下:

      1.当前指针指向根结点。

      2.打印当前结点,当前指针指向其左孩子结点并进栈,重复(2),直至左孩子为Null.

      3.依次退栈,将当前指针指向右孩子结点。

      4.若栈非空或者当前指针非Null,执行(2),否则结束.

    代码如下 c语言版本:

      void  Bit_PreOder(BitNode *root)

      {

        BitNode *p, * node[max];

        int top=0;p=root;

        do

         {while (p!=null)

          {printf("%d, ",p->data) ; node[top=p] ; top++; p=p->lch ;}    /* lch是指左子结点,rch是指右子节点 */

          if (top>0)

           { top-- ; p=node[top] ; p=p->rch ; }                 /*   凡是退栈的指针,其所指的结点及其左子树,都已遍历 */

         }while (top>0 || p!=null)

      }

 

  *   注意:以上代码已经过测试,可以使用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值