二叉树的非递归遍历　二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。　一.前序遍历　前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。　1.递归实现　void　preOrder1(BinTree　*　root)　//　递归前序遍历　{　if　(root　!=　NULL)　{　cout　　data　preOrder1(root　->　lchild);　preOrder1(root　->　rchild)2.非递归实现　根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下:　对于任一结点P:　1)访问结点P,并将结点P入栈;　2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P;　3)直到P为NULL并且栈为空,则遍历结束。　void　preOrder2(BinTree　*　root)　//　非递归前序遍历　{　stack　　s;　BinTree　*　p　=　root;　while　(p　!=　NULL　||!　s.empty())　{　while　(p　!=　NULL)　{　cout　　data　s.push(p);　p　=　p　->　lchild;　}　if　(　!　s.empty())　{　p　=　s.top();　s.pop();　p　=　p　->　rchild;二.中序遍历　中序遍历按照“左孩子-根结点-右孩子”的顺序进行访问。　1.递归实现　void　inOrder1(BinTree　*　root)　//　递归中序遍历　{　if　(root　!=　NULL)　{　inOrder1(root　->　lchild);　cout　　data　inOrder1(roo