二叉树非递归遍历实现-java版本
2015-12-12 10:52
423 查看
最近看了一下二叉树非递归遍历的实现,现在将思路写出来,若有不对,希望大家能够指出
//二叉树非递归先序遍历 private void preOrderBSTByUnRecur(Node head){ //先判断头节点是否为空 if(head != null){ Stack<Node> stack = new Stack<Node>(); //先顺遍历是先父节点,然后父节点的左儿子,父节点的右儿子, //所以先要将父节点压入栈 stack.add(head); //只要栈不为空则表示二叉树没有遍历完成 while(!stack.isEmpty()){ //先序遍历比较简单,访问父节点弹出后立即打印 //并判断是否右结点,有则入栈,然后判断是否有 //左结点,有则入栈 head = stack.pop(); System.out< 4000 span class="hljs-built_in">.println(head.data); //会有人问为什么先右后左,因为父结点读取值 //后不保存状态,所以先将右儿子压入栈,然后 //再判断是否有左儿子,有的话下一次操作则先 //对左儿子进行操作,符合先序遍历的逻辑 if(null != head.rightChild) stack.add(head.rightChild); if(null != head.leftChild) stack.add(head.leftChild); } } } //二叉树非递归中序遍历 private void inOrderBSTByUnRecur(Node head){ if(head != null){ Stack<Node> stack = new Stack<Node>(); //中序遍历是先左儿子,父结点,右儿子,所以循环条件 //是栈不为空且当前结点不为空 while(!stack.isEmpty() || head != null){ //只要父结点的左儿子不为空,则进行进栈操作 if(head != null){ stack.push(head); head = head.leftChild; }else{ //此时已经将整颗二叉树的最左端的 //左儿子压入栈,然后弹出并读值,取其右节点, //这时候有两种情况:1.右结点存在,则进入上一个判断 //取他的左儿子2.若右结点不存在,那么继续弹出并读值 head = stack.pop(); System.out.println(head.data); head = head.rightChild; } } } } //非递归后续遍历 private void postOrderBSTByUnRecur(Node head){ if(null != head){ Stack<Node> stack = new Stack<>(); //cur为stack的栈顶元素,pre为最后一个被打印的元素(初始值为根节点) Node cur = null,pre = head; //先将根节点押入 stack.push(pre); //stack为空则表示整个二叉树已遍历完 while(!stack.isEmpty()){ //cur为stack中的栈顶元素 cur = stack.peek(); //有三种情况,1.栈顶元素的左节点不为空,而最后打印元素不等于栈顶元素的左节点与右节点, //表示栈顶元素的左节点还未遍历,则入栈 if(cur.leftChild != null && pre != cur.leftChild && pre != cur.rightChild){ stack.push(cur.leftChild); //2.栈顶元素的右节点不为空,而最后打印元素不等于栈顶元素的右节点, //表示栈顶元素的右节点还未遍历,则入栈 }else if(cur.rightChild != null && pre != cur.rightChild){ stack.push(cur.rightChild); //3.最后,若栈顶元素的左右节点都已经被遍历或者为空,则出栈并打印,跟新最新打印节点 }else{ System.out.println(stack.pop().data); pre = cur; } } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统