`
frank-liu
  • 浏览: 1666083 次
  • 性别: Icon_minigender_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?

原问题链接:https://leetcode.com/problems/binary-tree-postorder-traversal/

 

问题分析

  和之前问题的讨论类似,关于二叉树的后序遍历,也是有固定的套路可循的。只是二叉树后续遍历的非递归解法确实比较复杂。需要仔细分析。

 

递归解法 

  这种解法还是固定的套路,首先递归的去看节点的左子节点,再去看节点的右子节点,再访问当前节点。在访问节点的时候将节点的值加入到列表中。

  详细的代码实现如下:

 

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new LinkedList<>();
        if(root == null) return result;
        postorderTraversal(root, result);
        return result;
    }
    
    private void postorderTraversal(TreeNode node, List<Integer> list) {
        if(node == null) return;
        if(node.left != null) postorderTraversal(node.left, list);
        if(node.right != null) postorderTraversal(node.right, list);
        list.add(node.val);
    }
}

 

非递归解法 

  这种解法思路如下:对于任意一个节点,我们需要访问了它的左右子节点之后才能访问它。所以,我们可以这样来考虑,对于一个节点,先将它入栈,如果它的左右子节点为空,则可以直接访问它。另外,如果它的左右子节点都被访问过了,也可以访问它。如果不是以上的这两种情况,则先后将它的右子节点和左子节点入栈。这样保证了每次先访问左子节点,再访问右子节点。 

 

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new LinkedList<>();
        LinkedList<TreeNode> stack = new LinkedList<>();
        TreeNode cur, pre = null;
        if(root != null) {
            stack.push(root);
            while(!stack.isEmpty()) {
                cur = stack.peek();
                if((cur.left == null && cur.right == null) || 
                    (pre != null && (pre == cur.left || pre == cur.right))) {
                    result.add(cur.val);
                    stack.pop();
                    pre = cur;
                } else {
                    if(cur.right != null) stack.push(cur.right);
                    if(cur.left != null) stack.push(cur.left);
                }
            }
        }
        return result;
    }
} 
分享到:
评论

相关推荐

    145.Binary Tree Postorder Traversal二叉树的后序遍历【LeetCode单题讲解系列】

    145.Binary_Tree_Postorder_Traversal二叉树的后序遍历【LeetCode单题讲解系列】

    leetcode卡-LeetCode:我的LeetCode解决方案

    leetcode卡 LeetCode 记录一下再LeetCode上...Postorder Traversal], Tree/stack 2017.06.20 打卡[LeetCode 107. Binary Tree Level Order Traversal II], Tree/BFS 2017.06.20 打卡[LeetCode 324. Wiggle Sort II], S

    LeetCode:LeetCode解决方案

    LeetCodeLeetCode solutions(Java)树Minimum Depth of Binary Tree栈evaluate-reverse-polish-notation穷举max-points-on-a-line链表sort-list排序insertion-sort-list树binary-tree-postorder-traversal树binary-...

    leetcode-tree

    144-Binary Tree Preorder Traversal94-Binary Tree Inorder Traversal145-Binary Tree Postorder Traversal(后续的非递归时间不够可以先跳过,有点难)层次遍历,队列辅助,相当于广搜。102-Binary Tree Level ...

    leetcode:LeetCode在线法官的Java解决方案

    Leetcode问题用JavaScript解决使用...二叉树后置遍历( https://leetcode.com/problems/binary-tree-postorder-traversal/ ) Node.js样式标准代码应遵循Node.js样式标准( https://github.com/felixge/node-style-gu

    LeetCodeSolution:LeetCode的部分解决方案

    Binary Tree Postorder Traversal (145) 要求不用递归实现后序遍历 后序是left-right-root,那么首先用修正的前序root-right-left,然后reverse一下,变成left-right-root就行了,代码如下: Factorial Trailing ...

    cpp-算法精粹

    Construct Binary Tree from Inorder and Postorder Traversal 二叉查找树 Unique Binary Search Trees Unique Binary Search Trees II Validate Binary Search Tree Convert Sorted Array to Binary Search Tree ...

    LeetCode最全代码

    * [Binary Search Tree](https://github.com/kamyu104/LeetCode#binary-search-tree) * [Breadth-First Search](https://github.com/kamyu104/LeetCode#breadth-first-search) * [Depth-First Search]...

    四平方和定理leetcode-leetcode-practice:个人LeetCode练习代码

    106.construct-binary-tree-from-inorder-and-postorder-traversal (从中序与后序遍历序列构造二叉树) 112.path-sum (路径总和) 116.populating-next-right-pointers-in-each-node (填充每个节点的下一个右侧节点

    lrucacheleetcode-LeetCode_Note:leetcode个人笔记

    lru缓存leetcode LeetCode_Note leetcode 个人笔记 ...[106_construct-binary-tree-from-inorder-and-postorder-traversal.cpp] [107_binary-tree-level-order-traversal-ii.cpp] [108_convert-sorted

    gasstationleetcode-leetcode-in-niuke:在牛客网上的在线编程中的leetcode在线编程题解

    binary-tree-postorder-traversal 树 binary-tree-preorder-traversal 链表 linked-list-cycle-ii 链表 linked-list-cycle 链表 copy-list-with-random-pointer 复杂度 single-number 动态规划 candy 贪心 gas-...

    leetcode跳跃-Algorithm:算法学习,包括leetcode算法题,

    leetcode 跳跃 Algorithm 算法题解: 包括书籍算法, 程序员算法面试指南, 还有leetcode算法题 ...construct-binary-tree-from-inorder-and-postorder-traversal 无官方题解 116 populating-next-right-pointers-in-eac

    javalruleetcode-algorithm-java:leetcode刷题

    java lru leetcode ...Tree/BinaryTree BST HashTable Disjoint Set Trie BloomFilter LRU Cache Algorithm General Coding InOrder/PreOrder/PostOrder Traversal Greedy Recursion/Backtrace Breadth-fi

    poj与leetcode-coding_exercises:编码练习

    poj与leetcode 自述文件 介绍 本repo由鞠承佑、钟恺健、王少泽创建。 它在帐户SuanFaRuoji(算法弱鸡)下...└──889_construct_binary_tree_from_preorder_and_postorder_traversal └──zkj_python.py 我们的任务

    【LeetCode】【树】106. 从中序与后序遍历序列构造二叉树

    https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/ 2 题目描述 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序...

Global site tag (gtag.js) - Google Analytics