当前位置:网站首页>leetcode:105. 从前序与中序遍历序列构造二叉树
leetcode:105. 从前序与中序遍历序列构造二叉树
2022-07-07 03:58:00 【uncle_ll】
105. 从前序与中序遍历序列构造二叉树
来源:力扣(LeetCode)
链接: https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
提示:
- 1 <= preorder.length <= 3000
- inorder.length == preorder.length
- -3000 <= preorder[i], inorder[i] <= 3000
- preorder 和 inorder 均 无重复 元素
- inorder 均出现在 preorder
- preorder 保证 为二叉树的前序遍历序列
- inorder 保证 为二叉树的中序遍历序列
解法
- 递归: 给出了前序遍历和中序遍历,前序遍历的第一个元素即为根节点位置,然后基于根节点的值去中序遍历中找到根节点的位置,基于此将中序遍历划分为左子树遍历与右子树遍历结果;基于左子树长度去前序遍历中找到左子树和右子树的前序遍历;下面就可以递归进行左子树的前序遍历与中序遍历,右子树的前序遍历与中序遍历;得到root.left与root.right, 最终返回root即可;关键是找root的下标;如果是使用index的方式查找的话,每次查找都需要一次遍历,复杂度为 O ( n ) O(n) O(n), 总的复杂度为 O ( n 2 ) O(n^2) O(n2), 这里使用哈希表存储一份中序遍历的下标,查找时间变为 O ( 1 ) O(1) O(1),空间换时间
代码实现
递归
python实现
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
n = len(preorder)
if n == 0:
return None
indexs = {
element: i for i, element in enumerate(inorder)}
def helper(preorder_left, preorder_right, inorder_left, inorder_right):
if preorder_left > preorder_right:
return None
preorder_index = preorder_left
inorder_root = indexs[preorder[preorder_index]]
root = TreeNode(preorder[preorder_index])
left_preorder_size = inorder_root - inorder_left
root.left = helper(1+preorder_left, preorder_left+left_preorder_size, inorder_left, inorder_root-1)
root.right = helper(1+preorder_left+left_preorder_size, preorder_right, inorder_root+1, inorder_right)
return root
return helper(0, n-1, 0, n-1)
c++实现
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */
class Solution {
private:
unordered_map<int, int> index;
public:
TreeNode* helper(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
if (preorder_left > preorder_right)
return nullptr;
int preorder_root = preorder_left;
int inorder_root = index[preorder[preorder_root]];
TreeNode* root = new TreeNode(preorder[preorder_root]);
int size_left_subtree = inorder_root - inorder_left;
root->left = helper(preorder, inorder, preorder_left+1, preorder_left+size_left_subtree, inorder_left, inorder_root-1);
root->right = helper(preorder, inorder, preorder_left+size_left_subtree+1, preorder_right, inorder_root+1, inorder_right);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
if (n == 0)
return nullptr;
for (int i=0; i<n; i++) {
index[inorder[i]] = i;
}
return helper(preorder, inorder, 0, n-1, 0, n-1);
}
};
复杂度分析
- 时间复杂度: O ( N ) O(N) O(N)
- 空间复杂度: O ( N ) O(N) O(N)
边栏推荐
- Mutual conversion between InputStream, int, shot, long and byte arrays
- 【Liunx】进程控制和父子进程
- Nesting and splitting of components
- 在线直播系统源码,使用ValueAnimator实现view放大缩小动画效果
- 抽絲剝繭C語言(高階)指針的進階
- js小练习----分时提醒问候、表单密码显示隐藏效果、文本框焦点事件、关闭广告
- 点亮显示屏的几个重要步骤
- 电商常规问题part1
- 聊聊异步编程的 7 种实现方式
- 1、 Go knowledge check and remedy + practical course notes youth training camp notes
猜你喜欢
MySQL service is missing from computer service
[ANSYS] learning experience of APDL finite element analysis
I failed in the postgraduate entrance examination and couldn't get into the big factory. I feel like it's over
Robot technology innovation and practice old version outline
$refs: get the element object or sub component instance in the component:
计算机服务中缺失MySQL服务
Freeswitch dials extension number source code tracking
Redis data migration
外包幹了三年,廢了...
Advanced level of C language (high level) pointer
随机推荐
1、 Go knowledge check and remedy + practical course notes youth training camp notes
How to * * labelimg
1142_ SiCp learning notes_ Functions and processes created by functions_ Linear recursion and iteration
Deep learning Flower Book + machine learning watermelon book electronic version I found
Sqlmap tutorial (IV) practical skills three: bypass the firewall
07_ Handout on the essence and practical skills of text measurement and geometric transformation
Nesting and splitting of components
UWB learning 1
Pass parent component to child component: props
机器人技术创新与实践旧版本大纲
Leetcode-226. Invert Binary Tree
按键精灵脚本学习-关于天猫抢红包
1140_ SiCp learning notes_ Use Newton's method to solve the square root
【性能压测】如何做好性能压测?
弹性布局(一)
Outlier detection technology of time series data
@component(““)
Select the product attribute pop-up box to pop up the animation effect from the bottom
Pass child component to parent component
在线直播系统源码,使用ValueAnimator实现view放大缩小动画效果