思路:
只用一個額外結點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已經被訪問過了,置空,下次不訪問。
}
}
}
}
}