【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】


【LeetCode-面试算法经典-Java实现】【全部题目文件夹索引】

原题

  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?

题目大意

  给定一个二叉树。输出后序遍历的结果。尝试使用两种方法实现

解题思路

  第一种:使用递归方式。

  另外一种:使用非递归的方法

  依据后序遍历的顺序,先訪问左子树,再訪问右子树,后訪问根节点。而对于每一个子树来说。又依照相同的訪问顺序进行遍历。后序遍历的非递归的实现相对来说要难一些,要保证根节点在左子树和右子树被訪问后才干訪问。思路例如以下:

   对于任一节点P,

  1)先将节点P入栈;

  2)若P不存在左孩子和右孩子,或者P存在左孩子或右孩子,但左右孩子已经被输出。则能够直接输出节点P,并将其出栈,将出栈节点P标记为上一个输出的节点,再将此时的栈顶结点设为当前节点;

  3)若不满足2)中的条件。则将P的右孩子和左孩子依次入栈,当前节点又一次置为栈顶结点。之后反复操作2)。

  4)直到栈空,遍历结束。

代码实现

结点类

public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}

第一种方法:算法实现类

import java.util.LinkedList;
import java.util.List; public class Solution {
private List<Integer> result;
public List<Integer> postorderTraversal(TreeNode root) {
result = new LinkedList<>();
preOrder(root);
return result;
} private void preOrder(TreeNode root) {
if (root != null) {
preOrder(root.left);
preOrder(root.right);
result.add(root.val);
}
}
}

另外一种方法:算法实现类

import java.util.Deque;
import java.util.LinkedList;
import java.util.List; public class Solution { public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>(); if (root != null) {
// 双端队列。当作栈来使用
Deque<TreeNode> deque = new LinkedList<>();
// 指向前一个处理的结点
TreeNode prev = null;
// 指向当前处理的结点
TreeNode curr;
// 根结点入栈
deque.addLast(root);
// 栈非空
while (!deque.isEmpty()) {
// 获取栈顶元素(不删除)
curr = deque.getLast();
if ((curr.left == null && curr.right == null) // 当前元素无左右子树
// prev != null && curr.left == prev,当前结点仅仅有左子树。而且左子树已经遍历完
// prev != null && curr.right == prev。当前结点有左右子树。而且左右子树已经遍历完
|| (prev != null && (curr.left == prev || curr.right == prev))) {
// 删除栈顶元素
curr = deque.removeLast();
// 结点值入栈
list.add(curr.val);
// 更新上一个处理的结点
prev = curr;
} else { // 左右子树未遍历完,将非空左右子树入栈 if (curr.right != null) {
deque.addLast(curr.right);
} if (curr.left != null) {
deque.addLast(curr.left);
}
}
}
} return list;
}
}

评測结果

  点击图片,鼠标不释放,拖动一段位置,释放后在新的窗体中查看完整图片。

第一种方法结果:

第一种方法结果:

特别说明

欢迎转载,转载请注明出处【http://blog.csdn.net/derrantcm/article/details/47774647

【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】的更多相关文章

  1. C++版 - LeetCode 145: Binary Tree Postorder Traversal(二叉树的后序遍历,迭代法)

    145. Binary Tree Postorder Traversal Total Submissions: 271797 Difficulty: Hard 提交网址: https://leetco ...

  2. LeetCode 145. Binary Tree Postorder Traversal二叉树的后序遍历 (C++)

    题目: Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [1,nul ...

  3. [LeetCode] N-ary Tree Postorder Traversal N叉树的后序遍历

    Given an n-ary tree, return the postorder traversal of its nodes' values. For example, given a 3-ary ...

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

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

  5. LeetCode 145. Binary Tree Postorder Traversal 二叉树的后序遍历 C++

    Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [,,] \ / O ...

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

    给定一棵二叉树,返回其节点值的后序遍历.例如:给定二叉树 [1,null,2,3],   1    \     2    /   3返回 [3,2,1].注意: 递归方法很简单,你可以使用迭代方法来解 ...

  7. Binary Tree Postorder Traversal(各种非递归实现,完美利用栈结构模拟)

    1.后序遍历的非递归实现.(左右根) 难点:后序遍历的非递归实现是三种遍历方式中最难的一种.因为在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子前访问才能访问根结点,这就为流程的控制带来 ...

  8. leetcode 590.N-ary Tree Postorder Traversal N叉树的后序遍历

    递归方法 C++代码: /* // Definition for a Node. class Node { public: int val; vector<Node*> children; ...

  9. 二叉树前序、中序、后序非递归遍历 144. Binary Tree Preorder Traversal 、 94. Binary Tree Inorder Traversal 、145. Binary Tree Postorder Traversal 、173. Binary Search Tree Iterator

    144. Binary Tree Preorder Traversal 前序的非递归遍历:用堆来实现 如果把这个代码改成先向堆存储左节点再存储右节点,就变成了每一行从右向左打印 如果用队列替代堆,并且 ...

随机推荐

  1. 16进制颜色字符串转为UIColor

    //16进制颜色(html颜色值)字符串转为UIColor +(UIColor *) hexStringToColor: (NSString *) stringToConvert {      NSS ...

  2. tp中使用事务

    是什么 事务是为了防止,多个操作,其中有失败,数据有部分被执行成功的时候使用的. 比如,银行,用户转账.张三钱扣了,结果李四钱还增加! 这个时候需要使用事务,确保张三钱扣了,李四的钱也增加,才真正的成 ...

  3. LightOJ--1094-- Farthest Nodes in a Tree(树的直径裸题)

    Farthest Nodes in a Tree Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu S ...

  4. hdoj--2534--Score(gcd)

    Score Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  5. springmvc生成注册验证码

    通过SPRing MVC为系统添加验证码 1:布局登陆页面,用户名,密码,填写验证码的文本框,及验证码的图片及点击换图 <%@ taglib prefix="c" uri=& ...

  6. sql获得某个时间段的数据

    CONVERT(Date, 时间字符串变量 ) between CONVERT(Date,'2015/2/10') and CONVERT(Date,'2015-3-10')

  7. 清北集训Day1T3 LYK loves jumping(期望DP)

    题目描述 LYK在玩一个魔法游戏,叫做跳跃魔法. 有n个点,每个点有两个属性hi和ti,表示初始高度,和下降高度.也就是说,它初始时高度为hi,一旦LYK踩在这个点上,由于重力的影响,这个点的高度会下 ...

  8. log4j:WARN Please initialize the log4j system properly.解决方案

    在使用quarz任务调度框架时的错误,实际上这个问题很常见,并不影响程序的使用,只是缺少日志输出,完整错误信息: log4j:WARN No appenders could be found for ...

  9. JOptionPane提示框的一些常用用法

    1.1 showMessageDialog 显示一个带有OK 按钮的模态对话框. 下面是几个使用showMessageDialog 的例子: JOptionPane.showMessageDialog ...

  10. Kattis - Virtual Friends(并查集)

    Virtual Friends These days, you can do all sorts of things online. For example, you can use various ...