//先序遍曆的非遞迴演算法
private void preOrderTraverse(BinTreeNode rt, LinkedList list){
if (rt==null) return;
BinTreeNode p = rt;
Stack s = new StackSLinked();
while (p!=null){
while (p!=null){ //向左走到盡頭
list.insertLast(p); //訪問根
if (p.hasRChild()) s.push(p.getRChild()); //右子樹根結點入棧
p = p.getLChild();
}
if (!s.isEmpty()) p = (BinTreeNode)s.pop(); //右子樹根退棧遍曆右子樹
}
}
//中序遍曆的非遞迴演算法
private void inOrderTraverse(BinTreeNode rt, LinkedList list){
if (rt==null) return;
BinTreeNode p = rt;
Stack s = new StackSLinked();
while (p!=null||!s.isEmpty()){
while (p!=null){ //一直向左走
s.push(p); //將根結點入棧
p = p.getLChild();
}
if (!s.isEmpty()){
p = (BinTreeNode)s.pop();//取出棧頂根結點訪問之
list.insertLast(p);
p = p.getRChild(); //轉向根的右子樹進行遍曆
}//if
}//out while
}
//後序遍曆的非遞迴演算法
private void postOrderTraverse(BinTreeNode rt, LinkedList list){
if (rt==null) return;
BinTreeNode p = rt;
Stack s = new StackSLinked();
while(p!=null||!s.isEmpty()){
while (p!=null){ //先左後右不斷深入
s.push(p); //將根節點入棧
if (p.hasLChild()) p = p.getLChild();
else p = p.getRChild();
}
if (!s.isEmpty()){
p = (BinTreeNode)s.pop(); //取出棧頂根結點訪問之
list.insertLast(p);
}
//滿足條件時,說明棧頂根節點右子樹已訪問,應出棧訪問之
while (!s.isEmpty()&&((BinTreeNode)s.peek()).getRChild()==p){
p = (BinTreeNode)s.pop();
list.insertLast(p);
}
//轉向棧頂根結點的右子樹繼續後序遍曆
if (!s.isEmpty()) p = ((BinTreeNode)s.peek()).getRChild();
else p = null;
}
}
//使用隊列完成二叉樹的層次遍曆
private void levelOrderTraverse(BinTreeNode rt, LinkedList list){
if (rt==null) return;
Queue q = new QueueArray();
q.enqueue(rt); //根結點入隊
while (!q.isEmpty()){
BinTreeNode p = (BinTreeNode)q.dequeue(); //取出隊首結點p並訪問
list.insertLast(p);
if (p.hasLChild()) q.enqueue(p.getLChild());//將p的非空左右孩子依次入隊
if (p.hasRChild()) q.enqueue(p.getRChild());
}
}