zoukankan      html  css  js  c++  java
  • LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal

    原题链接在这里:https://leetcode.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/

    题目:

    Return any binary tree that matches the given preorder and postorder traversals.

    Values in the traversals pre and post are distinct positive integers.

    Example 1:

    Input: pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
    Output: [1,2,3,4,5,6,7]

    Note:

    • 1 <= pre.length == post.length <= 30
    • pre[] and post[] are both permutations of 1, 2, ..., pre.length.
    • It is guaranteed an answer exists. If there exists multiple answers, you can return any of them.

    题解:

    The first element in pre, 1 is actually the root's val. 

    The second element in pre, 2 is root's left child val. Find 2's index in post, before that, all are root left subtree.

    Vice Versa.

    Use a HashMap to store post element and its index for quick search.

    In recursion, before using pre[preL+1], be careful with OutOfBoundException. Return when preL == preR. This makes sure after that, preL will not be out of index bound.

    Time Complexity: O(n).

    Space: O(n).

    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 TreeNode constructFromPrePost(int[] pre, int[] post) {
    12         if(pre == null || pre.length == 0 || post == null || post.length == 0){
    13             return null;
    14         }
    15         
    16         HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
    17         for(int i = 0; i<post.length; i++){
    18             hm.put(post[i], i);
    19         }
    20         
    21         return construct(pre, 0, pre.length-1, post, 0, post.length-1, hm);
    22     }
    23     
    24     private TreeNode construct(int[] pre, int preL, int preR, int[] post, int postL, int postR, HashMap<Integer, Integer> hm){
    25         if(preL > preR){
    26             return null;
    27         }
    28         
    29         TreeNode root = new TreeNode(pre[preL]);
    30         if(preL == preR){
    31             return root;
    32         }
    33         
    34         int leftVal = pre[preL+1];
    35         int leftIndex = hm.get(leftVal);
    36         root.left = construct(pre, preL+1, preL+1+leftIndex-postL, post, postL, leftIndex, hm);
    37         root.right = construct(pre, preL+2+leftIndex-postL, preR, post, leftIndex+1, postR-1, hm);
    38         return root;
    39     }
    40 }

    类似Construct Binary Tree from Preorder and Inorder TraversalConstruct Binary Tree from Inorder and Postorder Traversal.

  • 相关阅读:
    Java 定时任务
    Swing中常用的方法
    瀑布流ajax分页
    权限管理
    图片自动加水印
    jsp自动生成静态页(提供思路)
    分页查询语句
    使用phpmailer发送邮件(以QQ邮箱为例)
    在浏览器的标签页显示网站标志图标(或指定图标)的方法
    随机生成验证码
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/11063066.html
Copyright © 2011-2022 走看看