[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 duplicates do not exist in the tree.
For example, given
- inorder = [9,3,15,20,7]
- postorder = [9,15,7,20,3]
Return the following binary tree:
- 3
- / \
- 9 20
- / \
- 15 7
Java:
- public TreeNode buildTreePostIn(int[] inorder, int[] postorder) {
- if (inorder == null || postorder == null || inorder.length != postorder.length)
- return null;
- HashMap<Integer, Integer> hm = new HashMap<Integer,Integer>();
- for (int i=0;i<inorder.length;++i)
- hm.put(inorder[i], i);
- return buildTreePostIn(inorder, 0, inorder.length-1, postorder, 0,
- postorder.length-1,hm);
- }
- private TreeNode buildTreePostIn(int[] inorder, int is, int ie, int[] postorder, int ps, int pe,
- HashMap<Integer,Integer> hm){
- if (ps>pe || is>ie) return null;
- TreeNode root = new TreeNode(postorder[pe]);
- int ri = hm.get(postorder[pe]);
- TreeNode leftchild = buildTreePostIn(inorder, is, ri-1, postorder, ps, ps+ri-is-1, hm);
- TreeNode rightchild = buildTreePostIn(inorder,ri+1, ie, postorder, ps+ri-is, pe-1, hm);
- root.left = leftchild;
- root.right = rightchild;
- return root;
- }
Python:
- class TreeNode:
- def __init__(self, x):
- self.val = x
- self.left = None
- self.right = None
- class Solution:
- # @param inorder, a list of integers
- # @param postorder, a list of integers
- # @return a tree node
- def buildTree(self, inorder, postorder):
- lookup = {}
- for i, num in enumerate(inorder):
- lookup[num] = i
- return self.buildTreeRecu(lookup, postorder, inorder, len(postorder), 0, len(inorder))
- def buildTreeRecu(self, lookup, postorder, inorder, post_end, in_start, in_end):
- if in_start == in_end:
- return None
- node = TreeNode(postorder[post_end - 1])
- i = lookup[postorder[post_end - 1]]
- node.left = self.buildTreeRecu(lookup, postorder, inorder, post_end - 1 - (in_end - i - 1), in_start, i)
- node.right = self.buildTreeRecu(lookup, postorder, inorder, post_end - 1, i + 1, in_end)
- return node
- if __name__ == "__main__":
- inorder = [2, 1, 3]
- postorder = [2, 3, 1]
- result = Solution().buildTree(inorder, postorder)
- print(result.val)
- print(result.left.val)
- print(result.right.val)
C++:
- // Time: O(n)
- // Space: O(n)
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
- * };
- */
- class Solution {
- public:
- TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
- unordered_map<int, size_t> in_entry_idx_map;
- for (size_t i = 0; i < inorder.size(); ++i) {
- in_entry_idx_map.emplace(inorder[i], i);
- }
- return ReconstructPreInOrdersHelper(preorder, 0, preorder.size(), inorder, 0, inorder.size(),
- in_entry_idx_map);
- }
- // Reconstructs the binary tree from pre[pre_s : pre_e - 1] and
- // in[in_s : in_e - 1].
- TreeNode *ReconstructPreInOrdersHelper(const vector<int>& preorder, size_t pre_s, size_t pre_e,
- const vector<int>& inorder, size_t in_s, size_t in_e,
- const unordered_map<int, size_t>& in_entry_idx_map) {
- if (pre_s == pre_e || in_s == in_e) {
- return nullptr;
- }
- auto idx = in_entry_idx_map.at(preorder[pre_s]);
- auto left_tree_size = idx - in_s;
- auto node = new TreeNode(preorder[pre_s]);
- node->left = ReconstructPreInOrdersHelper(preorder, pre_s + 1, pre_s + 1 + left_tree_size,
- inorder, in_s, idx, in_entry_idx_map);
- node->right = ReconstructPreInOrdersHelper(preorder, pre_s + 1 + left_tree_size, pre_e,
- inorder, idx + 1, in_e, in_entry_idx_map);
- return node;
- }
- };
类似题目:
[LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树
All LeetCode Questions List 题目汇总
[LeetCode] 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树的更多相关文章
- 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 ...
- 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: ...
- (二叉树 递归) 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 ...
- 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 ...
- 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 ...
- [leetcode] 106. Construct Binary Tree from Inorder and Postorder Traversal(medium)
原题地址 思路: 和leetcode105题差不多,这道题是给中序和后序,求出二叉树. 解法一: 思路和105题差不多,只是pos是从后往前遍历,生成树顺序也是先右后左. class Solution ...
- Leetcode#106 Construct Binary Tree from Inorder and Postorder Traversal
原题地址 二叉树基本操作 [ ]O[ ] [ ][ ]O 代码: TreeNode *restore(vector<i ...
- 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal 解题报告
[LeetCode]106. Construct Binary Tree from Inorder and Postorder Traversal 解题报告(Python) 标签: LeetCode ...
- 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...
随机推荐
- Java调用Kotlin事项及Kotlin反射初步
继续来研究Java调用Kotlin的一些东东. @Throws注解: 我们知道在Kotlin中是不存在checked exception的,而在Java中是存在的,那..如果从Java来调用Kotli ...
- C# 保存文件到数据库
html <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUploa ...
- Python开发笔记:网络数据抓取
网络数据获取(爬取)分为两部分: 1.抓取(抓取网页) · urlib内建模块,特别是urlib.request · Requests第三方库(中小型网络爬虫的开发) · Scrapy框架(大型网络爬 ...
- STLNormalFunc
#include <iostream> #include <vector> using namespace std; void main_1() { vector<int ...
- ssh2
UserBiz public interface UserBiz { public List<User> list(User user); public int add(User user ...
- 使用terraform v0.12 生成gitlab repo 创建部署tf 文件
以前写过一个使用模版引擎+ rest 接口的模式,生成tf 文件,v0.12 直接提供了方便的json 处理函数 我们可以直接结合http 以及templatefile providers 方便的 ...
- SPA 首屏加载性能优化之 vue-cli3 拆包配置
前言 现在已经是vue-cli3.x webpack4.x 的时代了,但是网上很多拆包配置还是一些比较低版本的. 本文主要是分享自己的拆包踩坑经验. 主要是用了webpack4 的 splitC ...
- SQL基础-更新&删除&视图
一.更新数据 1.更新数据 ### 更新全部数据: 使用UPDATE关键字.语法如下: UPDATE 表名 SET 字段名=新的值; 比如: 更新学生表中的所有学生性别为男: UPDATE stude ...
- CMD下文件操作
CMD下常用文件操作指令 1.输入盘符 如C: 然后回车,相当于进了C盘(c盘一般进的是桌面目录) 2.输入 cd 目录名 然后回车(目录名是c盘中的一级目录名,也可为c盘中的目录路径).如cd mm ...
- 转载:scala中的:+\+:\::\:::
原文链接:https://segmentfault.com/a/1190000005083578 初学Scala的人都会被Seq的各种操作符所confuse.下面简单列举一下各个Seq操作符的区别. ...