二叉树的中序遍历的非递归算法

来源:互联网 发布:杭州友谦网络 编辑:程序博客网 时间:2024/05/23 18:31

先回顾二叉树的中序遍历的递归算法:

先遍历左子树

然后遍历根结点

最后遍历右子树

对于左子树和右子树使用同样的思想

 

二叉树的中序遍历的非递归算法的思想:

中序遍历最先输出的结点是根结点的左子树中的左子树。。。(即最底层的左子树,即叶子结点的左子树),这可以通过反复执行p=p->left实现。同时要保证能回到左子树的根结点,这就需要用栈来存储在查找叶子左子树时经过的结点。这样在访问左子树后,就可以通过出栈得到此结点的根结点。

因为是中序遍历,在访问根结点后,再访问右结点,即p=p->right,原来同上左子树,知道p为空且堆栈为空

 

二叉树的中序遍历的非递归算法的实现:

  1. void InOrderUnrec(Bitree t)
    {
     SqStack s;
     StackInit(s);
     p=t;
     while (p!=null || !StackEmpty(s))
     {
       while (p!=null)       //遍历左子树
       {
         push(s,p);
         p=p->lchild;
       }//endwhile
        
       if (!StackEmpty(s))
       {
         p=pop(s);
         visite(p->data);    //访问根结点
         p=p->rchild;      //通过下一次循环实现右子树遍历
       }//endif  
      
     }//endwhile 
     
    }//InOrderUnrec 
     
原创粉丝点击