后续遍历二叉树

来源:互联网 发布:开淘宝店的技巧 编辑:程序博客网 时间:2024/04/29 06:19

后续遍历二叉树,递归实现二叉树后续遍历,先递归左孩子节点,然后递归右孩子节点,最后输出节点值。非递归实现二叉树后续遍历,需要借助两个栈。

非递归实现二叉树后续遍历,需要借助两个栈来实现
第一个栈按前序遍历将二叉树节点压栈
第二个栈是当第一个栈要出栈的时候,将当前出栈的节点压栈到第二个栈
如果当前节点存在左孩子节点,则压栈到第一个栈
如果当前节点存在右孩子节点,则压栈到第一个栈
 最后当第一个栈为空的时候,这时候遍历第二个栈,让第二个栈一直出栈并且输出当前节点值

实现过程如下所示:

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+" ");}}}


0 0
原创粉丝点击