用java实现二叉树的前序、中序、后序、层次遍历(递归和非递归版)

用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+",");
		}
	}

	

}


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值