二叉树的先序,中序,后序非递归遍历【java】

来源:互联网 发布:wifi有信号没网络 编辑:程序博客网 时间:2024/06/02 15:53

                        二叉树的先序,中序,后序遍历的非递归算法【java】 

           闲来无事,复习一下数据结构,尝试用java写二叉树的先序,中序和后序遍历,递归的方法很简单,此处不赘述,非递归的方法需要调用栈,加深对栈的理解。
       其中先序和中序遍历思路几乎相同,都是先把所有的左子树入栈,直到叶子结点为止。所不同的是先序遍历在入栈之前就访问了根结点,一路入栈,一路就顺便输出了每棵子树的根结点,然后出栈的每个结点的左子树都已经访问过了,直接访问右子树即可。而中序遍历是先一路把左子树全部入栈,都不访问,然后出栈最左边的结点进行访问,若该结点有右子树,则直接访问其右子树,若右子树为空,再次出栈就是该结点的父亲结点,再进行访问,接下来再试探右子树的有无,这就实现了中序遍历。
       后序遍历跟中序遍历有相似之处,毕竟都是先访问左孩子,先把左子树全部入栈后,取出栈顶结点(即最左边的结点),此时,若该结点没有右孩子,就可以访问该结点,否则,把该结点重新入栈,并设置标注1。这时要先访问该结点的右子树,之后才能访问该结点,因为后序遍历的左-右-根的关系。该结点的右子树访问完之后,该结点还会在出栈的时候出现,这时才到了该访问他的时候,访问即可。
        数据结构之类的东西,还是要经常动手练练,否则易生疏。
<pre name="code" class="java">package data_structure;import java.util.Stack;//二叉树的先序,中序,后序遍历的非递归算法public class BinTreeNode {private char data;private BinTreeNode lChild;private BinTreeNode rChild;private int visited;//public BinTreeNode(){//this.data=0;//this.lChild=null;//this.rChild=null;////}public BinTreeNode(char data,BinTreeNode lChild,BinTreeNode rChild,int visited){this.data=data;this.lChild=lChild;this.rChild=rChild;this.visited=visited;}//先序遍历public void preOrderBT(BinTreeNode p){Stack<BinTreeNode> s=new Stack<BinTreeNode>();while(p!=null||s.size()!=0){if(p!=null){System.out.println(p.data);s.push(p);p=p.lChild;}else{p=s.pop();p=p.rChild;}}}//中序遍历public void inOrderBT(BinTreeNode p){Stack<BinTreeNode> s=new Stack<BinTreeNode>();while(p!=null||s.size()!=0){if(p!=null){s.push(p);p=p.lChild;}else{p=s.pop();System.out.println(p.data);p=p.rChild;}}}//后序遍历略难public void postOrderBT(BinTreeNode p){Stack<BinTreeNode> s=new Stack<BinTreeNode>();while(p!=null||s.size()!=0){if(p!=null){//左孩子全部入栈s.push(p);p=p.lChild;}else{p=s.pop();//标注为1,代表他的右孩子已经全部访问完了,此时可以打印该节点if(p.visited==1){                System.out.println(p.data);                p.visited=2;}//对于没有右孩子的结点,直接输出                if(p.rChild==null&&p.visited==0)                {                System.out.println(p.data);                p.visited=2;                }                //对于有右孩子的结点,先入栈,不访问,并标注为1                if(p.rChild!=null&&p.visited==0){s.push(p);p.visited=1;}                p=p.rChild;}}}public static void main(String[] args) {// TODO Auto-generated method stubBinTreeNode[] Btree=new BinTreeNode[10];for(int i=0;i<10;i++)Btree[i]=new BinTreeNode('l',null,null,0);Btree[0].data='k';Btree[0].lChild=Btree[1];Btree[1].data='a';Btree[1].lChild=Btree[2];Btree[1].rChild=Btree[8];Btree[2].data='b';Btree[2].lChild=Btree[3];Btree[3].data='c';Btree[3].lChild=Btree[4];Btree[3].rChild=Btree[5];Btree[4].data='d';Btree[5].data='e';Btree[5].lChild=Btree[6];Btree[5].rChild=Btree[7];Btree[6].data='f';Btree[7].data='g';Btree[7].rChild=Btree[9];Btree[8].data='h';Btree[9].data='i';//Btree[0].preOrderBT(Btree[0]);//Btree[0].inOrderBT(Btree[0]);Btree[0].postOrderBT(Btree[0]);}}


0 0