【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. Android接口和框架学习

    Android接口和框架学习 缩写: HAL:HardwareAbstraction Layer.硬件抽象层 CTS:CompatibilityTest Suite,兼容性測试套件 Android让你 ...

  2. 【MySQL】MySQL删除匿名用户,保证登录安全

    博客地址已迁往 www.virtclouds.com 原文地址 http://www.virtclouds.com/538.html 很多MySQL程序都会带有匿名登录的功能. 在刚刚安装完MySQL ...

  3. 2015.05.12,外语,读书笔记-《Word Power Made Easy》 15 “如何谈论不同人的特点” SESSION 45

    TEASER PREVIEW 以-ous结尾的,描绘某人特点的词语包括: fawning(['fɔ:niŋ] adj.奉承的),servilely(['sә:vail] adj. 卑屈的, 奴隶的) ...

  4. CodeForces--609C --Load Balancing(水题)

    Load Balancing Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Subm ...

  5. 关于iOS11上MJRefresh tabview刷新后,重新加载另一组数据, 回不到顶部或者头尾显示混乱等问题解决

    MJRefresh在iOS11上存在很多bug 比如在iphoenx上首尾仍会显示的问题 刷新数据后tableview置顶不上去等问题 虽然官方给出了适配方案  但是问题还没有的到解决 比如tabvi ...

  6. VB入门在线视频教程大全学习

    课程目录 9分钟47秒 课时1第一课:怎么编写程序 14分钟1秒 课时1第十七课第1节:文件读写的几种方式 14分钟14秒 课时2第二课:什么是变量和变量类型 19分钟24秒 课时3第三课:变量的声明 ...

  7. hdu 1532 Drainage Ditches 【ISAP 】

    还是不是很懂算法 先存一个模板先吧--- 看的这篇学的-- http://www.renfei.org/blog/isap.html #include<cstdio> #include&l ...

  8. HDU 1009 FatMouse' Trade【贪心】

    解题思路:一只老鼠共有m的猫粮,给出n个房间,每一间房间可以用f[i]的猫粮换取w[i]的豆,问老鼠最多能够获得豆的数量 sum 即每一间房间的豆的单价为v[i]=f[i]/w[i],要想买到最多的豆 ...

  9. mongodb主从搭建

    #tigergao 官网进行下包,可以下载源码包或者二进制包,本次下载的为二进制包,进行试验. 主服务器搭建: mkdir mongomaster cp mongodb-linux-x86_64-rh ...

  10. 操作mysql操作数据库

    操作数据库 查询数据库:show databases: 增加数据库:create database student default character set uft-8:(设置默认字符集) 删除数据 ...