非递归实现中序遍历二叉树,需要借助栈来实现,首先定义一个当前的树节点,先让二叉树的左子树进栈,并且当前节点指向二叉树的左子树,当当前节点为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;
}
}
}
}