[M二叉树] lc105. 从前序与中序遍历序列构造二叉树(递归建树+迭代建树+经典问题)

文章目录

    • 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;
    }
};

你可能感兴趣的:(LeetCode,算法)