二叉树的先序,中序,后序非递归遍历【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
- 二叉树的先序,中序,后序非递归遍历【java】
- java建立二叉树,递归/非递归先序遍历,递归/非递归中序遍历,层次遍历
- 二叉树的先序、中序、后序递归遍历和非递归遍历
- 二叉树的递归创建,先序(中序、后序)递归遍历二叉树
- 二叉树T 的先序遍历、中序遍历、后序遍历(递归实现)
- 二叉树的先序、中序、后序非递归遍历的实现
- 二叉树的先序递归以及非递归遍历
- 二叉树的先序递归,非递归遍历
- java 实现二叉树的构建,先序,中序,后序,层次,递归,非递归的遍历
- C++ 二叉树的遍历---先序遍历(非递归)
- 二叉树的先序、中序、后序非递归遍历(C++版)
- 二叉树(一) 先序遍历、中序遍历、后续遍历、层次遍历的递归与非递归实现
- 二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现
- Java二叉树(三)--非递归的中序_先序_后序遍历二叉树
- 二叉树的先序、中序、后序遍历的递归和非递归实现
- 二叉树的先序、中序、后续遍历的递归和非递归实现
- 二叉树的后序,先序,中序遍历的非递归遍历
- 建立二叉树,实现二叉树的先序,中序遍历的递归算法
- day(1) 在Windows7上搭建Cocos2d-x 3.2alpha0开发环境
- 关于原码,反码,补码和左右移位的若干思考
- CF #261 DIV2 A,B,C,D
- Java nio 实践
- VMware创建虚拟机
- 二叉树的先序,中序,后序非递归遍历【java】
- 【java swing 编程】文件替换小秘书(三)
- CF 459D - Pashmak and Parmida's problem (树状数组)
- uva_127 - "Accordian" Patience
- string转NSSTring*
- ACM 81. 乘法问题(水dp)
- 关键路径
- UVA - 12001 UVa Panel Discussion
- 推挽输出与开漏输出的区别