博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的前序、中序、后序和层次遍历
阅读量:4664 次
发布时间:2019-06-09

本文共 2366 字,大约阅读时间需要 7 分钟。

  实现Java中非递归实现二叉树的前序、中序、后序、层序遍历,在非递归实现中,借助了栈来帮助实现遍历。前序和中序比较类似,也简单一些,但是后序遍历稍微复杂一些,层序遍历中借助了一个队列来进行实现。

二叉树

 根据上面二叉树的形状来看,四种遍历后的结果应该如下所示:

  • 前序遍历:4 2 1 3 6 5 7 8 10

  • 中序遍历:1 2 3 4 5 6 7 8 10

  • 后序遍历:1 3 2 5 10 8 7 6 4

  • 层序遍历:4 2 6 1 3 5 7 8 10

/**	 * 前序遍历——非迭代	 */	public void nonRecOrder(TreeNode root) {		if (root == null) {			return;		}		Stack
stack = new Stack<>(); stack.push(root); // 拿出元素 while (stack.size() > 0) { TreeNode node = stack.pop(); System.out.println("非递归前序遍历节点:" + node.data); if (node.rightChild != null) { stack.push(node.rightChild); } if (node.leftChild != null) { stack.push(node.leftChild); } // 继续拿出元素进行遍历,这时拿的应该是左边的 } }

  

/**	 * 中序遍历——非迭代	 * 	 * @author Administrator	 * 	 */	public void nonMidOrder(TreeNode node) {		if (node == null) {			return;		}		Stack
stack = new Stack<>(); while (node != null || stack.size() > 0) { while (node != null) { stack.push(node); node = node.leftChild; } // 所有的左子节点压栈后,开始出栈 // 拿到栈顶的节点 node = stack.pop(); System.out.println("非递归中序遍历节点:" + node.data); node = node.rightChild; } }

  

/**	 * 后序遍历——非迭代	 * 	 * @author Administrator	 * 	 */	public void nonPostOrder(TreeNode node) {		if (node == null) {			return;		}		Stack
stack = new Stack<>(); TreeNode lastVisitNode = null; while (node != null) { stack.push(node); node = node.leftChild; } // 先从最后一个左子节点开始判断 while (stack.size() > 0) { // 判断当前节点是否有右子节点,并且该右子节点没有被访问过 node = stack.pop(); if (node.rightChild != null && node.rightChild != lastVisitNode) { // 说明有右子节点,该根节点还需要再被用到,所以压回栈 stack.push(node); node = node.rightChild; while (node != null) { stack.push(node); node = node.leftChild; } } else { // 说明当前的节点没右子节点(左子节点也没有) System.out.println("非递归后序遍历节点:" + node.data); // 访问过后,代表该节点被访问过 lastVisitNode = node; } } }

  

// 层次遍历	public void levelOrder(TreeNode node) {		if (node == null) {			return;		}		LinkedList
list = new LinkedList<>(); list.addLast(node); while (list.size() > 0) { // 取出队头元素 node = list.removeFirst(); System.out.println("层次遍历:" + node.data); if (node.leftChild != null) { list.addLast(node.leftChild); } if (node.rightChild != null) { list.addLast(node.rightChild); } } }

  

转载于:https://www.cnblogs.com/Booker808-java/p/8896233.html

你可能感兴趣的文章
需求分析文档(3月22日)
查看>>
【剑指offer】丑数
查看>>
JAVA-JSP注释
查看>>
latch: shared pool等待事件
查看>>
根据繁忙程度来选择快照的id
查看>>
服务器MySql搭建
查看>>
checkbox控制text是否可以填写和radio是否可选
查看>>
P3811 【模板】乘法逆元
查看>>
ORACLE 行迁移和行链接
查看>>
MSSQL跨服務器複製數據
查看>>
Javascript(js) dateDiff 日期减法函数
查看>>
第四百七十四天 how can I 坚持
查看>>
ASP.NET - 回滚事务
查看>>
Xshell 乱码
查看>>
delphi10.3.1不支持.net 5
查看>>
Docker-06-持久化存储和数据共享
查看>>
LeetCode——264. Ugly Number II
查看>>
深入理解asp.net SessionState
查看>>
52.1076 排序
查看>>
浅析CentOS和RedHat Linux的区别(转)
查看>>