非遞歸實現中序遍歷二叉樹,需要藉助棧來實現,首先定義一個當前的樹節點,先讓二叉樹的左子樹進棧,並且當前節點指向二叉樹的左子樹,噹噹前節點爲null的時候,出棧,先讓棧指針指向當前節點,並且打印當前節點,然後右子樹進棧,接着左子樹進棧,一直這樣的操作,直到不滿足循環條件,跳出循環。實現過程如下所示:
package cn.edu.nwu.structs.tree;
import java.util.Stack;
/**
* @author jcm
* 中序遍歷二叉樹
* 時間 2016年9月3日
*/
public class InOrderBinaryTreeNode {
public static void main(String[] args) {
BinaryTreeNode root = CreateBinaryTree.createBinaryTree();
System.out.println("遞歸實現中序遍歷");
inOrder(root);
System.out.println();
System.out.println("非遞歸用棧實現中序遍歷");
inOrderRecursion(root);
}
/**
* @author jcm
* 中序遍歷二叉樹
* @param root
*/
public static void inOrder(BinaryTreeNode root){
if(root == null){
return ;
}
if(root.leftTreeNode != null){
inOrder(root.leftTreeNode);
}
//輸出根節點
System.out.print(root.data+" ");
if(root.rightTreeNode != null){
inOrder(root.rightTreeNode);
}
}
/**
* 非遞歸實現中序遍歷
* @param root
*/
public static void inOrderRecursion(BinaryTreeNode root){
if(root == null){
return ;
}
Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
BinaryTreeNode currentTNode = root;
while(!stack.isEmpty() || currentTNode != null){
//這個循環是左子樹進棧
while(currentTNode != null){
stack.push(currentTNode);
currentTNode = currentTNode.leftTreeNode;
}
if(!stack.isEmpty()){
currentTNode = stack.peek();
System.out.print(currentTNode.data+" ");
stack.pop();
//考慮左子樹優先,進入到右子樹時,時時刻刻要訪問左子樹。
currentTNode = currentTNode.rightTreeNode;
}
}
}
}