zoukankan      html  css  js  c++  java
  • LeetCode 145. Binary Tree Postorder Traversal

    原题链接在这里:https://leetcode.com/problems/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?

    题解:

    类似Binary Tree Inorder Traversal 和 Binary Tree Preorder Traversal.

    Method 1:  Recursion

    Time Complexity: O(n). Space: O(logn).

    AC Java:

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     //Method 1: Recursion
    12     public List<Integer> postorderTraversal(TreeNode root) {
    13         //Recursion
    14         List<Integer> ls = new ArrayList<Integer>();
    15         helper(root,ls);
    16         
    17         return ls;
    18     }
    19     private void helper(TreeNode root,List<Integer> ls){
    20         if(root == null){
    21             return;
    22         }
    23         helper(root.left,ls);
    24         helper(root.right,ls);
    25         ls.add(root.val);
    26     }
    27 }

    Method 2: 

    Pretty much like method 2 of Binary Tree Preorder Traversal.

    The difference is that when pushing into stack, push from left to right.

    Time Complexity: O(n).

    Space: O(logn).

    AC Java:

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 class Solution {
    11     public List<Integer> postorderTraversal(TreeNode root) {
    12         List<Integer> res = new ArrayList<>();
    13         if(root == null){
    14             return res;
    15         }
    16         
    17         Stack<TreeNode> stk = new Stack<>();
    18         stk.push(root);
    19         while(!stk.isEmpty()){
    20             TreeNode cur = stk.pop();
    21             res.add(cur.val);
    22             if(cur.left != null){
    23                 stk.push(cur.left);
    24             }
    25             
    26             if(cur.right != null){
    27                 stk.push(cur.right);
    28             }
    29         }
    30         
    31         Collections.reverse(res);
    32         return res;
    33     }
    34 }

    Method 3: Iteration + Stack

    和Preorder, Inorder 类似.

    当栈顶点右侧为空 或者 右侧已经traverse 过了, 就可以把栈顶的点加入res中. 节点pre用来记载刚刚加入res的点, 可以用来判定右侧是否已经traverse过了.

    top.right == pre 说明right已经加入res里了.

    Time Complexity: O(n), 每个点访问了一次. Space:O(logn).

    AC Java:

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 class Solution {
    11     public List<Integer> postorderTraversal(TreeNode root) {
    12         List<Integer> res = new ArrayList<Integer>();
    13         Stack<TreeNode> stk = new Stack<TreeNode>();
    14         TreeNode pre = null;
    15         while(root != null || !stk.isEmpty()){
    16             if(root != null){
    17                 stk.push(root);
    18                 root = root.left;
    19             }else{
    20                 TreeNode top = stk.peek();
    21                 if(top.right == null || top.right == pre){
    22                     res.add(top.val);
    23                     stk.pop();
    24                     pre = top;
    25                 }else{
    26                     root = top.right;
    27                 }
    28             }
    29         }
    30         return res;
    31     }
    32 }
  • 相关阅读:
    访问虚拟机
    w3school JavaScript 简介
    蘑菇街2016研发工程师在线编程题
    乐视2017暑期实习生笔试题(二)
    今日头条2017后端工程师实习生笔试题
    c# 读取 excel文件内容,写入txt文档
    处理字符串
    XML获取节点信息值
    SVN仓库目录结构
    sql 知识点
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/4825025.html
Copyright © 2011-2022 走看看