用java实现二叉树的前序、中序、后序、层次遍历(递归和非递归版)
并没有写插入方法,因为树不一定是完全二叉树(建树在主函数),还有这个二叉树只是体现数据结构,并不严谨,仅供参考,代码如下:
package com.ma.al.binaryTree;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
/**
* @author xiaoma
*
*/
public class MyTree {
static MyTree root;
int val;
MyTree left = null;
MyTree right = null;
public MyTree() {
super();
}
public MyTree(int val) {
this.val = val;
}
//=========================================================================================
//递归实现前序遍历
ArrayList<Integer> list1 = new ArrayList<Integer>();
public ArrayList<Integer> preOrder(MyTree root){
if(root != null){
list1.add(root.val);
if(root.left != null) preOrder(root.left);
if(root.right != null) preOrder(root.right);
}
return list1;
}
//非递归实现前序遍历
ArrayList<Integer> list2 = new ArrayList<Integer>();
public ArrayList<Integer> preOrder2(MyTree root){
Stack<MyTree> stack = new Stack<MyTree>();
while(root != null || !stack.isEmpty()){
while(root != null){
list2.add(root.val);
stack.push(root);
root = root.left;
}
if(!stack.isEmpty()){
root = stack.pop();
root = root.right;
}
}
return list2;
}
//=========================================================================================
//递归实现中序遍历
ArrayList<Integer> list3 = new ArrayList<Integer>();
public ArrayList<Integer> inOrder(MyTree root){
if(root != null){
if(root.left != null) inOrder(root.left);
list3.add(root.val);
if(root.right != null) inOrder(root.right);
}
return list3;
}
//非递归实现中序遍历
ArrayList<Integer> list4 = new ArrayList<Integer>();
public ArrayList<Integer> inOrder2(MyTree root){
Stack<MyTree> stack = new Stack<MyTree>();
while(root != null || !stack.isEmpty()){
while(root != null){
stack.push(root);
root = root.left;
}
if(!stack.isEmpty()){
root = stack.pop();
list4.add(root.val);
root = root.right;
}
}
return list4;
}
//=========================================================================================
//递归实现后序遍历
ArrayList<Integer> list5 = new ArrayList<Integer>();
public ArrayList<Integer> postOrder(MyTree root){
if(root != null){
if(root.left !=null) postOrder(root.left);
if(root.right !=null) postOrder(root.right);
list5.add(root.val);
}
return list5;
}
//非递归实现后序遍历
ArrayList<Integer> list6 = new ArrayList<Integer>();
public ArrayList<Integer> postOrder2(MyTree root){
Stack<MyTree> stack1= new Stack<MyTree>();
Stack<Integer> stack2 = new Stack<Integer>();
while(!stack1.isEmpty() || root != null){
while(root != null){
stack1.push(root);
stack2.push(0);
root = root.left;
}
while(!stack1.isEmpty() && stack2.peek() == 1){
stack2.pop();
list6.add(stack1.pop().val);
}
if(!stack1.isEmpty()){
stack2.pop();
stack2.push(1);//标记为1表示该节点可以出栈了
root = stack1.peek();
root = root.right;
}
}
return list6;
}
//=========================================================================================
//用队列实现层次遍历
public ArrayList<Integer> PrintFromTopToBottom(MyTree root) {
ArrayList<Integer> list = new ArrayList<Integer>();
Queue<MyTree> queue = new LinkedList<MyTree>();
queue.offer(root);
while(!queue.isEmpty()){
MyTree myTree = queue.poll();
list.add(myTree.val);
if(myTree.left != null){
queue.offer(myTree.left);
}
if(myTree.right != null){
queue.offer(myTree.right);
}
}
return list;
}
//=========================================================================================
@SuppressWarnings("static-access")
public static void main(String[] args) {
MyTree my =new MyTree();
my.root = new MyTree(1);
my.root.left = new MyTree(9);
my.root.right = new MyTree(3);
my.root.left.left = new MyTree(6);
my.root.left.right =new MyTree(7);
my.root.left.right.left = new MyTree(5);
my.root.right.left = new MyTree(2);
my.root.right.left.right = new MyTree(10);
my.root.right.right =new MyTree(8);
/*ArrayList<Integer> list = my.PrintFromTopToBottom(root);
for (Integer li : list) {
System.out.print(li+",");
}*/
ArrayList<Integer> preOrder = my.postOrder2(root);
for (Integer pre : preOrder) {
System.out.print(pre+",");
}
}
}