后续遍历二叉树,递归实现二叉树后续遍历,先递归左孩子节点,然后递归右孩子节点,最后输出节点值。非递归实现二叉树后续遍历,需要借助两个栈。
非递归实现二叉树后续遍历,需要借助两个栈来实现
第一个栈按前序遍历将二叉树节点压栈
第二个栈是当第一个栈要出栈的时候,将当前出栈的节点压栈到第二个栈
如果当前节点存在左孩子节点,则压栈到第一个栈
如果当前节点存在右孩子节点,则压栈到第一个栈
最后当第一个栈为空的时候,这时候遍历第二个栈,让第二个栈一直出栈并且输出当前节点值
实现过程如下所示:
package cn.edu.nwu.tree;
import java.util.Stack;
/**
* @author jcm
*
*时间 2016年9月15日
*/
public class GetTreeNodePostTraver {
public static void main(String[] args) {
TreeNode root = CreateBinaryTree.createTreeNode();
System.out.println("递归实现二叉树后续遍历");
postOrderRecursion(root);
System.out.println();
System.out.println("非递归实现二叉树后续遍历");
postOrder(root);
}
/**
* @author jcm
* 递归实现二叉树的后续遍历
* (1)如果二叉树为空,空操作
* (2)如果二叉树不为空,访问根节点,后续遍历左子树,后续遍历右子树
* @param root
*/
private static void postOrderRecursion(TreeNode root) {
if(root == null){
return;
}
postOrderRecursion(root.leftChild);
postOrderRecursion(root.rightRight);
System.out.print(root.data+" ");
}
/**
* @author jcm
* 非递归实现二叉树后续遍历,需要借助两个栈来实现
* 第一个栈按前序遍历将二叉树节点压栈
* 第二个栈是当第一个栈要出栈的时候,将当前出栈的节点压栈到第二个栈
* 如果当前节点存在左孩子节点,则压栈到第一个栈
* 如果当前节点存在右孩子节点,则压栈到第一个栈
* 最后当第一个栈为空的时候,这时候遍历第二个栈,让第二个栈一直出栈并且输出当前节点值
* @param root
*/
private static void postOrder(TreeNode root) {
if(root == null){
return;
}
//第一个栈stack存放先序遍历二叉树节点
Stack<TreeNode> stack = new Stack<TreeNode>();
//第二个栈用来存放翻转第一个栈的输出
Stack<TreeNode> outPut = new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode current = stack.pop();
outPut.push(current);
if(current.leftChild != null){
stack.push(current.leftChild);
}
if(current.rightRight != null){
stack.push(current.rightRight);
}
}
//遍历第二个栈,其实质为后续遍历
while(!outPut.isEmpty()){
TreeNode printTreeNode = outPut.pop();
System.out.print(printTreeNode.data+" ");
}
}
}