文章目录
- 1. 题目来源
- 2. 题目解析
1. 题目来源
链接:105. 从前序与中序遍历序列构造二叉树
力扣题解:官方题解:从前序与中序遍历序列构造二叉树
之前的博文:
- 剑指 offer 的博文,有图例,代码也十分清楚! [剑指-Offer] 7. 重建二叉树(二叉树、递归建树)
2. 题目解析
参考原有博文即可:剑指 offer 的博文,有图例,代码也十分清楚! [剑指-Offer] 7. 重建二叉树(二叉树、递归建树)
十分经典的问题哈,这里主要记录下还有一种迭代的写法,迭代写法可以去参考官方题解中的写法,确实第一次见这个巧妙的迭代建树的写法。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
/*** 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 {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {return build(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size());}TreeNode* build(vector<int> &preorder, int pL, int pR, vector<int> &inorder, int iL, int iR) {if (pL > pR || iL > iR) return NULL;int i = iL;for (; i <= iR; i ++ ) {if (preorder[pL] == inorder[i])break;}TreeNode *node = new TreeNode(preorder[pL]);node->left = build(preorder, pL + 1, pL + i - iL, inorder, iL, i - 1);node->right = build(preorder, pL + i - iL + 1, pR, inorder, i + 1, iR);return node;}
};