package study.java.datastructure.tree;
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.LinkedBlockingDeque;
public class TreeTraversal {
public static BinTreeBean myTree = null;
static {
myTree = new BinTreeBean();
myTree.setData("A");
BinTreeBean nodeB = new BinTreeBean();
nodeB.setData("B");
BinTreeBean nodeC = new BinTreeBean();
nodeC.setData("C");
BinTreeBean nodeD = new BinTreeBean();
nodeD.setData("D");
BinTreeBean nodeE = new BinTreeBean();
nodeE.setData("E");
BinTreeBean nodeF = new BinTreeBean();
nodeF.setData("F");
BinTreeBean nodeG = new BinTreeBean();
nodeG.setData("G");
myTree.setLeftChild(nodeB);
myTree.setRightChild(nodeC);
nodeB.setLeftChild(nodeD);
nodeB.setRightChild(nodeE);
nodeE.setLeftChild(nodeG);
nodeC.setRightChild(nodeF);
}
/**
* 递归先序遍历
* @param tree
*/
public static void preOrder(BinTreeBean tree) {
if(tree != null) {
System.out.print(tree.getData() + " ");
preOrder(tree.getLeftChild());
preOrder(tree.getRightChild());
}
}
/**
* 递归中序遍历
* @param tree
*/
public static void inOrder(BinTreeBean tree) {
if(tree != null) {
inOrder(tree.getLeftChild());
System.out.print(tree.getData() + " ");
inOrder(tree.getRightChild());
}
}
/**
* 非递归中序遍历
* @param tree
*/
public static void inOrderNonRecur(BinTreeBean tree) {
Stack<BinTreeBean> myStack = new Stack<BinTreeBean>();
myStack.push(tree);
while(!myStack.isEmpty()) {
while(myStack.peek() !=null) {
myStack.push(myStack.peek().getLeftChild());
}
myStack.pop();
if(!myStack.isEmpty()) {
BinTreeBean p = myStack.pop();
System.out.print(p.getData() + " ");
myStack.push(p.getRightChild());
}
}
}
/**
* 递归后序遍历
* @param tree
*/
public static void postOrder(BinTreeBean tree) {
if(tree != null) {
postOrder(tree.getLeftChild());
postOrder(tree.getRightChild());
System.out.print(tree.getData() + " ");
}
}
/**
* 层序遍历
* @param tree
*/
public static void levelOrder(BinTreeBean tree) {
if(tree != null) {
Queue<BinTreeBean> queue = new LinkedBlockingDeque<BinTreeBean>();
queue.add(tree);
while(!queue.isEmpty()) {
BinTreeBean p = queue.poll();
System.out.print(p.getData() + " ");
if(p.getLeftChild() != null) {
queue.add(p.getLeftChild());
}
if(p.getRightChild() != null) {
queue.add(p.getRightChild());
}
}
}
}
public static void main(String[] args) {
System.out.print("递归先序遍历二叉树:");
preOrder(myTree);
System.out.println();
System.out.print("递归中序遍历二叉树:");
inOrder(myTree);
System.out.println();
System.out.print("非递归中序遍历二叉树:");
inOrderNonRecur(myTree);
System.out.println();
System.out.print("递归后序遍历二叉树:");
postOrder(myTree);
System.out.println();
System.out.print("层序遍历二叉树:");
levelOrder(myTree);
}
}