思路:
只用一个额外结点p。
构造一个栈,将根节点入栈。
每次循环做如下事情;
p来控制左孩子一直入栈,直到没有左孩子,这时p在最左边的结点。
这时如果p有右孩子,就将p指向p的右孩子,并将右孩子入栈。
如果没有的话p置空就行(不然的话,p还是在最左边的结点,下次循环会重新循环p)
import java.util.Stack;
class TreeNode{
TreeNode left = null;
TreeNode right = null;
public int data = 0;
TreeNode(int data){
this.data = data;
}
}
public class InOrder {
public static void main(String[] args){
TreeNode t1 = new TreeNode(1);
TreeNode t2 = new TreeNode(2);
TreeNode t3 = new TreeNode(3);
TreeNode t4 = new TreeNode(4);
TreeNode t5 = new TreeNode(5);
TreeNode t6 = new TreeNode(6);
t1.left = t2;
t2.left = t3;
t2.right = t4;
t4.left = t5;
t5.right = t6;
inOrder(t1);
}
public static void inOrder(TreeNode root){
if(root == null){
return ;
}
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode p = root;
s.add(p); //这里直接add(p) 不是root。
while( !s.empty()){
if(p != null && p.left != null){
s.add(p.left); //这里add的不是p而是p.left
p = p.left;
}else{ //else不能少,不然每次都弹出去一个元素
p = s.pop();
System.out.println(p.data);
if(p.right != null){
s.add(p.right);
p = p.right;
}else{
p = null; //p已经被访问过了,置空,下次不访问。
}
}
}
}
}