二叉树非递归遍历

先序遍历

先序遍历顺序:中左右
首先构造一个栈,将根节点压入栈。然后弹出栈顶部元素,打印输出,再压入弹出元素的右儿子和左儿子(注意顺序)。
这时再开始循环,弹出栈顶元素,打印输出,再压入弹出元素的右儿子和左儿子,直到最后栈元素为空

 public void before(Node root) {
    	if(root==null)
    		return;
    	Stack stack=new Stack();
    	stack.push(root);
    	while(!stack.isEmpty()) {
    		Node out=stack.pop();
    		System.out.println(out.val+"-->");
    		if(out.right!=null)
    			stack.push(out.right);
    		if(out.left!=null)
    			stack.push(out.left);
    	}
    }

后序遍历

后序遍历顺序:左右中
想象上面先序的输出的顺序,中左右
我们把这段代码左右进栈的顺序变一下,不就成了中右左吗?

			if(out.right!=null)
    			stack.push(out.right);
    		if(out.left!=null)
    			stack.push(out.left);

然后我们在打印输出的时候不打印,而是再创建一个栈,在打印的时候把元素压入栈,这样不就从
中右左变成左右中,变成后序遍历了吗?

 public void after(Node root) {
    	if(root==null)
    		return;
    	Stack stack=new Stack();
    	Stack outStack=new Stack();
    	stack.push(root);
    	while(!stack.isEmpty()) {
    		Node out=stack.pop();
    		outStack.push(out);
    		if(out.left!=null)
    			stack.push(out.left);
    		if(out.right!=null)
    			stack.push(out.right);
    	}
    	while(!outStack.isEmpty()) {
    		System.out.println(outStack.pop().val+"->");
    	}
    }

中序遍历

将指定节点的左儿子的左儿子的左儿子压入栈.直到该节点为空。然后栈里弹出一个,打印信息,再将该节点右儿子压入栈,开始循环上面的过程。

 public void in(Node root) {
    	if(root==null)
    		return;
    	Stack stack=new Stack();
    	Node cur=root;
    	while(!stack.isEmpty()||cur!=null) {
    		if(cur!=null) {
    			stack.push(cur);
    			cur=cur.left;
    		}else {
    			cur=stack.pop();
    			System.out.println(cur.val+"->");
    			cur=cur.right;
    		} 			
    	}
    }

你可能感兴趣的:(面试)