非递归方式遍历二叉树

Posted 误入IT界的农民工

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非递归方式遍历二叉树相关的知识,希望对你有一定的参考价值。

  /**
     * 非递归方式的先根序
     * @param root
     */
    public static void preOrder(Node root){
        Stack<Node> stack = new Stack<Node>();
        while (!stack.isEmpty() || root != null) {
        	while (root != null) {
        		System.out.println(root.data);
        		stack.push(root);
        		root = root.left;
        	}
        	
        	if (!stack.isEmpty()) {
        		root = stack.pop();
        		root = root.right;
        	}
        }
        
    }
    
    /**
     * 非递归的方式中根序遍历二叉树
     * @param node
     */
    public static void orderBinaryTree(Node node) {
    	Stack<Node> stack = new Stack<Node>();
    	Node point = node;
    	while (!stack.isEmpty() || point != null) {
    		//如果左子树不为空,则一直入栈
    		if (point != null) {
    			stack.push(point);
    			point = point.left;
    		} else {
    			point = stack.peek();
    			visit(point);
    			point = point.right;
    			stack.pop();
    		}
    	}
    }
    
    /**
     * 非递归方式后根序
     * @param node
     */
    public static void lastOrder(Node node) {
    	Stack<Node> stackNode = new Stack<Node>();
    	Stack<Integer> stackInt = new Stack<Integer>();
    	int i = 1;
    	while (!stackNode.isEmpty() || node != null) {
    		while(node != null) {
    			stackNode.push(node);
    			stackInt.push(0);
    			node = node.left;
    		}
    		while (!stackNode.isEmpty() && stackInt.peek() == i) {
    			stackInt.pop();
    			System.out.println(stackNode.pop().data);
    		}
    		
    		if (!stackNode.isEmpty()) {
    			stackInt.pop();
    			stackInt.push(1);
    			node = stackNode.peek();
    			node = node.right;
    		}
    	}
    }
    

  创建一棵二叉树:

public class Node {
	Node left = null;
	Node right = null;
	Integer data;
	/**
	 * 
	 * @param root
	 */
	public Node() {
		this.left = null;
		this.right = null;
		this.data = null;
	}
	
	public Node(Integer data) {
		this.left = null;
		this.right= null;
		this.data = data;
	}

}

  

以上是关于非递归方式遍历二叉树的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的三种非递归遍历方式(附Cjava源码)

九十五二叉树的递归和非递归的遍历算法模板

九十五二叉树的递归和非递归的遍历算法模板

二叉树的三种非递归遍历方式

二叉树的遍历方式(递归非递归)

二叉树遍历(先序中序后序)