先序遍历
先序遍历顺序:中左右
首先构造一个栈,将根节点压入栈。然后弹出栈顶部元素,打印输出,再压入弹出元素的右儿子和左儿子(注意顺序)。
这时再开始循环,弹出栈顶元素,打印输出,再压入弹出元素的右儿子和左儿子,直到最后栈元素为空
public void before(Node root) {
if(root==null)
return;
Stack<Node> stack=new Stack<Node>();
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<Node> stack=new Stack<Node>();
Stack<Node> outStack=new Stack<Node>();
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<Node> stack=new Stack<Node>();
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;
}
}
}