Java数据结构系列之——树(5):二叉树的后序遍历的递归与非递归实现

package tree.binarytree;

import java.util.Stack;

/**
 * 二叉树后序遍历的递归与非递归实现
 *
 * @author wl
 *
 */
public class BitreePostOrder {
	// 后序遍历的递归实现
	public static void biTreePostOrderByRecursion(BiTreeNode root) {
		if (root == null) {
			return;
		}

		biTreePostOrderByRecursion(root.leftNode);
		biTreePostOrderByRecursion(root.rightNode);
		System.out.println(root.data);
	}

	/**
	 * 后序遍历的非递归实现 要保证根节点在左孩子和右孩子访问之后才能访问,因此,对于任一结点current,先将其入栈,如果current不存在左孩子
	 * 和右孩子,则可以直接访问它;或者current存在左孩子或者右孩子,但是其左孩子和右孩子都已近访问过了,则同样可以直接
	 * 访问改结点。若非上述两种情况,则将current的右孩子和左孩子(注意是先右孩子后左孩子)依次入栈。这样就保证了每次取
	 * 栈顶元素的时候,左孩子在右孩子前被访问,左孩子和右孩子都在根结点前面被访问
	 *
	 * @param root
	 */
	public static void biTreePostOrder(BiTreeNode root) {
		Stack<BiTreeNode> stack = new Stack<BiTreeNode>();// 栈,用于存放二叉树的结点
		BiTreeNode current = root;// 当前结点
		BiTreeNode pre = null;// 前一次被访问的结点

		stack.push(root);
		while (!stack.empty()) {
			current = stack.peek();
			if ((current.leftNode == null && current.rightNode == null)
					|| (pre != null && (pre == current.leftNode || pre == current.rightNode))) {
				System.out.println(current.data);
				stack.pop();
				pre = current;
			} else {
				if (current.rightNode != null) {
					stack.push(current.rightNode);
				}
				if (current.leftNode != null) {
					stack.push(current.leftNode);
				}
			}
		}
	}
}

时间: 2024-10-02 10:24:09

Java数据结构系列之——树(5):二叉树的后序遍历的递归与非递归实现的相关文章

树——二叉树的后序遍历(非递归)

思路: 二叉树的后序遍历非递归方法与前序,中序不同,稍微麻烦一些. 要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点cur,先将其入栈.如果cur不存在左孩子和右孩子,则可以直接访问它:或者cur存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点.若非上述两种情况,则将cur的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问. 代码如下: /** * Definition for

Binary Tree Postorder Traversal 二叉树的后序遍历

地址:https://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 题意就是完成二叉树的后序遍历,我们知道如果使用递归进行二叉树后序遍历将是非常简单的事情. public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer > ans = new ArrayList<>(); Tr

剑指Offer面试题24(Java版):二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如输入数组{5,7,6,9,11,10,8}则返回true,因为这个整数序列是下图二叉树的后序遍历的结果.如果输入的数组是{7,4,6,5},由于没有哪颗二叉搜索树的后续遍历的结果是这个序列,因此返回false. 在后序遍历得到的序列中,最后一个数字是树的根节点的值.数组中前面的数字可以分为两部分:第一部分是左子树结点的值,它们都比根节点的值

二叉树的后序遍历(暴力版) 小白菜oj 1034

给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历-- 作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法--但只是估计-- 下面讲述我的超暴力解法-- 首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可. 但这个方法有两个比较--&¥--&的问题:1

leetcode题解:Binary Tree Postorder Traversal (二叉树的后序遍历)

题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 说明: 1) 两种实现,递归与非递归 , 其中非递归有两种方法 2)复杂度分析:时

二叉树先序、中序、后序遍历的递归算法和非递归算法

先序遍历:若二叉树为空,则空操作:否则访问根节点:先序遍历左子树:先序遍历右子树. 中序遍历:若二叉树为空,则空操作:否则中序遍历左子树:访问根节点:中序遍历右子树. 后序遍历:若二叉树为空,则空操作:否则后序遍历左子树:后序遍历右子树:访问根节点. 二叉链表:链表中的结点包含三个域:数据域和左右指针域. 三叉链表:在二叉链表的基础上增加指向双亲结点的指针域. 以下代码均使用二叉链表. //二叉树的二叉链表存储表示 typedef char TElemType; typedef struct B

二叉树 根据后序遍历生成二叉树

题目:给定一个二叉树的后序遍历数组arr[],生成二叉树 解题思路:根据搜索二叉树的性质,数组的最后一位arr[end]是二叉树的根,而且数组的左部分比arr[end]小,是根节点的左子数,数字的右部分比arr[end]大,是数组的右子数. Example: 树的形状如上图,后序遍历为:1 3 2 6  8 7 5 arr[end] = 5; 左部分(左子树):{1,3,2} 右部分(右子树):{6,8,7} package cn.edu.algorithm.prototype; /** * 根

判断序列是否是二叉树的后序遍历序列

这个题的意思就是给定一个序列,判断这个序列是否是某个二叉排序树的后序遍历序列,这个算法的方法主要是根据后序遍历的性质,首先这个序列的最后一个元素肯定是根元素,然后将序列从左往右遍历,找到第一个大于根元素的点,这个点左边的肯定是当前根的左子树,这个点的右边肯定是当前根的右子树,继续向后遍历,看右子树中是否有值小于根,如果有,则false,否则分左右子树分别再次调用函数进行判断.具体代码如下: 1 public class IsLastOrder{ 2 3 public boolean islast

[LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历

Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 经典题目,求二叉树的后序遍历的非递归方法,跟前序,中序,层序一样都需要用到栈,后续的顺序

已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

题目描述 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列. 输入 第一行输入二叉树的先序遍历序列: 第二行输入二叉树的中序遍历序列. 输出 输出该二叉树的后序遍历序列. 示例输入 ABDCEF BDAECF 示例输出 DBEFCA #include <iostream> #include <cstring> #define MAX 50+3 using namespace std; typedef char Elem_Type; typedef struct B