Java基础 - 二叉树的遍历之深度优先遍历(非递归遍历)
2016-11-19 03:06
465 查看
package com.yc.test; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; import com.yc.tree.ThreeLinkBinTree; import com.yc.tree.ThreeLinkBinTree.Node; /** * * @author wb *下面以三叉链表结构的二叉树为例实现这三种遍历: */ public class DFS { @SuppressWarnings({ "rawtypes", "unused", "unchecked" }) public static void main(String[] args) { ThreeLinkBinTree<String> tree = new ThreeLinkBinTree<String>("A"); Node n2_l = tree.addAndReturn(tree.root(), "+", true); Node n2_r = tree.addAndReturn(tree.root(), "B", false); Node n3_n2_l = tree.addAndReturn(n2_l, "*", true); Node n3_n2_r = tree.addAndReturn(n2_l, "D", false); Node n4_n3_n2_l = tree.addAndReturn(n3_n2_l, "/", true); Node n4_n3_n2_r = tree.addAndReturn(n3_n2_l, "%", false); Node n5_n4_n3_n2_l = tree.addAndReturn(n4_n3_n2_r, "E", true); Node n5_n4_n3_n2_r = tree.addAndReturn(n4_n3_n2_r, "F", false); /** * 此时二叉树的情况为: * A * │ │ * + ←┘ └→ B * │ │ * * ←┘ └→ D * │ │ * / ←┘ └→ % * │ │ * E ←┘ └→ F * */ System.out.println( "非递归先序遍历结果:" + cStackDLR(tree)); System.out.println( "非递归先序遍历结果:" + cStackLDR(tree)); System.out.println( "非递归后序遍历结果:" + cStackLRD(tree)); } //非递归方式前序遍历 public static List<Node> cStackDLR(ThreeLinkBinTree<String> tree){ return stackDLR(tree.root()); } private static List<Node> stackDLR(Node node) { //用于返回的 List<Node> nodes = new ArrayList<Node>(); //用于操作的(在前面的几章中讲到Deque继承了 Queue和Stack俩个接口或者类,所以它具有队列和栈的特性) Deque<Node> deque = new ArrayDeque<Node>(); deque.push(node); mainDealForDFS(deque, nodes); return nodes; } //非递归方式中序遍历 public static List<Node> cStackLDR(ThreeLinkBinTree<String> tree){ return stackLDR(tree.root()); } private static List<Node> stackLDR(Node node) { //用于返回的 List<Node> nodes = new ArrayList<Node>(); //用于操作的(在前面的几章中讲到Deque继承了 Queue和Stack俩个接口或者类,所以它具有队列和栈的特性) Deque<Node> deque = new ArrayDeque<Node>(); Node rootLeftChild = node.getLeft(); Node rootRightChild = node.getRight(); deque.push(rootLeftChild); mainDealForDFS(deque, nodes); nodes.add(node); deque.push(rootRightChild); mainDealForDFS(deque, nodes); return nodes; } //非递归方式后序遍历 public static List<Node> cStackLRD(ThreeLinkBinTree 4000 <String> tree){ return stackLRD(tree.root()); } private static List<Node> stackLRD(Node node) { //用于返回的 List<Node> nodes = new ArrayList<Node>(); //用于操作的(在前面的几章中讲到Deque继承了 Queue和Stack俩个接口或者类,所以它具有队列和栈的特性) Deque<Node> deque = new ArrayDeque<Node>(); Node rootLeftChild = node.getLeft(); Node rootRightChild = node.getRight(); deque.push(rootLeftChild); mainDealForDFS(deque, nodes); deque.push(rootRightChild); mainDealForDFS(deque, nodes); nodes.add(node); return nodes; } private static void mainDealForDFS(Deque<Node> deque, List<Node> nodes){ while(!deque.isEmpty()){ //移除栈顶节点并添加到nodes里 Node tempN = deque.pop(); nodes.add( tempN); if(tempN != null){ if(tempN.getRight() != null){ deque.push( tempN.getRight()); } if(tempN.getLeft() != null){ deque.push( tempN.getLeft()); } } } } }
测试结果为:
非递归先序遍历结果:[A, +, *, /, %, E, F, D, B] 非递归先序遍历结果:[+, *, /, %, E, F, D, A, B] 非递归后序遍历结果:[+, *, /, %, E, F, D, B, A]
相关文章推荐
- 【leetcode Java】二叉树的递归遍历以及最大深度的求解(Java)
- 二叉树的基础(遍历、深度、二叉树相等、判断平衡二叉树)
- Java实现二叉树的先序、中序、后序、层次遍历,数的最大深度、最大宽度
- 二叉树的各种操作(递归和非递归遍历,树深度,结点个数等等)(Java)
- java基础知识回顾之javaIO类--File类应用:递归深度遍历文件
- Java遍历二叉树深度宽度
- 二叉树的深度和广度优先遍历 - Java实现
- 二叉树的基础应用(建树+叶子数+深度+遍历 )
- 剑指offer之求二叉树的深度(非递归的层次遍历)Java实现
- Java 非递归方式深度优先遍历二叉树
- 二叉树的深度和广度优先遍历 - Java实现-2
- 二叉树的操作 深度广度遍历,二叉树递归和非递归遍历
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- 二叉树的操作 深度广度遍历,二叉树递归和非递归遍历
- 二叉树的基础代码:遍历+深度
- 【java基础:集合和IO】文件深度遍历和存储的demostration
- [java]二叉树构建、遍历、深度、平衡性
- java实现二叉树的建立,前中后序遍历,层次遍历,深度,节点个数等
- java二叉树实现、遍历、求深度
- Java 递归形式深度优先遍历二叉树