二叉树遍历的非递归算法

上一篇文章讲的都是递归的遍历方法,其实没什么技术含量。可能是因为还没上升到实际的代码编写的原因所以个人感觉没什么技术,充其量是了解了如何遍历二叉树。现在考虑下非递归遍历的算法。

非递归的遍历方法,是用栈来代替递归。下面的算法中S是一个栈,P=T。

先序遍历的非递归算法如下:

while(P||IsEmpty(s)){
        if(P){
              visit(P);
              push(S,P);
              P = P.left;
        }else{
           pop(S,P);
           P = P.right;
        }
}

中序遍历的非递归算法

<pre name="code" class="java"><pre name="code" class="java">while(P||IsEmpty(s)){
        if(P){
              push(S,P);
              P = P.left;
        }else{
           pop(S,P);
           visit(P);
           P = P.right;
        }
}

 
 
 后续的非遍历有点复杂现在还没想明白,不过确实弄明白一件事。用非递归算法代替递归算法需要用程序员的思维弄清楚到底什么时候出栈和入栈,在程序的可读方面递归的代码简洁了好多。总之在效率和方便性上要做一个取舍。当非常在意效率的时候(设备内存较小)可以选用非递归的方式,若设置不是太差可以选用递归方式,毕竟开发速度要快了好多。但是在笔试或者面试的时候,个人感觉一个递归算法估计就让你离offer远了好多,一个非递归的算法可以让你离offer更近。 
 

你可能感兴趣的:(二叉树,遍历,非递归)