Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

For example, given

  1. inorder = [9,3,15,20,7]
  2. postorder = [9,15,7,20,3]

Return the following binary tree:

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7

Java:

  1. public TreeNode buildTreePostIn(int[] inorder, int[] postorder) {
  2. if (inorder == null || postorder == null || inorder.length != postorder.length)
  3. return null;
  4. HashMap<Integer, Integer> hm = new HashMap<Integer,Integer>();
  5. for (int i=0;i<inorder.length;++i)
  6. hm.put(inorder[i], i);
  7. return buildTreePostIn(inorder, 0, inorder.length-1, postorder, 0,
  8. postorder.length-1,hm);
  9. }
  10.  
  11. private TreeNode buildTreePostIn(int[] inorder, int is, int ie, int[] postorder, int ps, int pe,
  12. HashMap<Integer,Integer> hm){
  13. if (ps>pe || is>ie) return null;
  14. TreeNode root = new TreeNode(postorder[pe]);
  15. int ri = hm.get(postorder[pe]);
  16. TreeNode leftchild = buildTreePostIn(inorder, is, ri-1, postorder, ps, ps+ri-is-1, hm);
  17. TreeNode rightchild = buildTreePostIn(inorder,ri+1, ie, postorder, ps+ri-is, pe-1, hm);
  18. root.left = leftchild;
  19. root.right = rightchild;
  20. return root;
  21. }  

Python:

  1. class TreeNode:
  2. def __init__(self, x):
  3. self.val = x
  4. self.left = None
  5. self.right = None
  6.  
  7. class Solution:
  8. # @param inorder, a list of integers
  9. # @param postorder, a list of integers
  10. # @return a tree node
  11. def buildTree(self, inorder, postorder):
  12. lookup = {}
  13. for i, num in enumerate(inorder):
  14. lookup[num] = i
  15. return self.buildTreeRecu(lookup, postorder, inorder, len(postorder), 0, len(inorder))
  16.  
  17. def buildTreeRecu(self, lookup, postorder, inorder, post_end, in_start, in_end):
  18. if in_start == in_end:
  19. return None
  20. node = TreeNode(postorder[post_end - 1])
  21. i = lookup[postorder[post_end - 1]]
  22. node.left = self.buildTreeRecu(lookup, postorder, inorder, post_end - 1 - (in_end - i - 1), in_start, i)
  23. node.right = self.buildTreeRecu(lookup, postorder, inorder, post_end - 1, i + 1, in_end)
  24. return node
  25.  
  26. if __name__ == "__main__":
  27. inorder = [2, 1, 3]
  28. postorder = [2, 3, 1]
  29. result = Solution().buildTree(inorder, postorder)
  30. print(result.val)
  31. print(result.left.val)
  32. print(result.right.val)

C++:

  1. // Time: O(n)
  2. // Space: O(n)
  3.  
  4. /**
  5. * Definition for a binary tree node.
  6. * struct TreeNode {
  7. * int val;
  8. * TreeNode *left;
  9. * TreeNode *right;
  10. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  11. * };
  12. */
  13. class Solution {
  14. public:
  15. TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
  16. unordered_map<int, size_t> in_entry_idx_map;
  17. for (size_t i = 0; i < inorder.size(); ++i) {
  18. in_entry_idx_map.emplace(inorder[i], i);
  19. }
  20. return ReconstructPreInOrdersHelper(preorder, 0, preorder.size(), inorder, 0, inorder.size(),
  21. in_entry_idx_map);
  22. }
  23.  
  24. // Reconstructs the binary tree from pre[pre_s : pre_e - 1] and
  25. // in[in_s : in_e - 1].
  26. TreeNode *ReconstructPreInOrdersHelper(const vector<int>& preorder, size_t pre_s, size_t pre_e,
  27. const vector<int>& inorder, size_t in_s, size_t in_e,
  28. const unordered_map<int, size_t>& in_entry_idx_map) {
  29. if (pre_s == pre_e || in_s == in_e) {
  30. return nullptr;
  31. }
  32.  
  33. auto idx = in_entry_idx_map.at(preorder[pre_s]);
  34. auto left_tree_size = idx - in_s;
  35.  
  36. auto node = new TreeNode(preorder[pre_s]);
  37. node->left = ReconstructPreInOrdersHelper(preorder, pre_s + 1, pre_s + 1 + left_tree_size,
  38. inorder, in_s, idx, in_entry_idx_map);
  39. node->right = ReconstructPreInOrdersHelper(preorder, pre_s + 1 + left_tree_size, pre_e,
  40. inorder, idx + 1, in_e, in_entry_idx_map);
  41. return node;
  42. }
  43. };

 

类似题目:

[LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树

All LeetCode Questions List 题目汇总

[LeetCode] 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树的更多相关文章

  1. LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树 C++

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  2. Java for LeetCode 106 Construct Binary Tree from Inorder and Postorder Traversal

    Construct Binary Tree from Inorder and Postorder Traversal Total Accepted: 31041 Total Submissions: ...

  3. (二叉树 递归) leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  4. LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal (用中序和后序树遍历来建立二叉树)

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  5. C#解leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  6. [leetcode] 106. Construct Binary Tree from Inorder and Postorder Traversal(medium)

    原题地址 思路: 和leetcode105题差不多,这道题是给中序和后序,求出二叉树. 解法一: 思路和105题差不多,只是pos是从后往前遍历,生成树顺序也是先右后左. class Solution ...

  7. Leetcode#106 Construct Binary Tree from Inorder and Postorder Traversal

    原题地址 二叉树基本操作 [       ]O[              ] [       ][              ]O 代码: TreeNode *restore(vector<i ...

  8. 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal 解题报告

    [LeetCode]106. Construct Binary Tree from Inorder and Postorder Traversal 解题报告(Python) 标签: LeetCode ...

  9. 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal

    Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...

随机推荐

  1. Java调用Kotlin事项及Kotlin反射初步

    继续来研究Java调用Kotlin的一些东东. @Throws注解: 我们知道在Kotlin中是不存在checked exception的,而在Java中是存在的,那..如果从Java来调用Kotli ...

  2. C# 保存文件到数据库

    html <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUploa ...

  3. Python开发笔记:网络数据抓取

    网络数据获取(爬取)分为两部分: 1.抓取(抓取网页) · urlib内建模块,特别是urlib.request · Requests第三方库(中小型网络爬虫的开发) · Scrapy框架(大型网络爬 ...

  4. STLNormalFunc

    #include <iostream> #include <vector> using namespace std; void main_1() { vector<int ...

  5. ssh2

    UserBiz public interface UserBiz { public List<User> list(User user); public int add(User user ...

  6. 使用terraform v0.12 生成gitlab repo 创建部署tf 文件

      以前写过一个使用模版引擎+ rest 接口的模式,生成tf 文件,v0.12 直接提供了方便的json 处理函数 我们可以直接结合http 以及templatefile providers 方便的 ...

  7. SPA 首屏加载性能优化之 vue-cli3 拆包配置

    前言 现在已经是vue-cli3.x    webpack4.x 的时代了,但是网上很多拆包配置还是一些比较低版本的. 本文主要是分享自己的拆包踩坑经验. 主要是用了webpack4 的 splitC ...

  8. SQL基础-更新&删除&视图

    一.更新数据 1.更新数据 ### 更新全部数据: 使用UPDATE关键字.语法如下: UPDATE 表名 SET 字段名=新的值; 比如: 更新学生表中的所有学生性别为男: UPDATE stude ...

  9. CMD下文件操作

    CMD下常用文件操作指令 1.输入盘符 如C: 然后回车,相当于进了C盘(c盘一般进的是桌面目录) 2.输入 cd 目录名 然后回车(目录名是c盘中的一级目录名,也可为c盘中的目录路径).如cd mm ...

  10. 转载:scala中的:+\+:\::\:::

    原文链接:https://segmentfault.com/a/1190000005083578 初学Scala的人都会被Seq的各种操作符所confuse.下面简单列举一下各个Seq操作符的区别. ...