剑指offer:面试题07. 重建二叉树

题目: 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

限制:

0 <= 节点个数 <= 5000

解题:

  • 前序遍历:先访问根结点,再访问左子结点,最后访问右子结点。
  • 中序遍历:先访问左子结点,再访问根结点,最后访问右子结点。
  • 后序遍历:先访问左子结点,再访问右子结点,最后访问根结点。
/**
 * 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:
    unordered_map<int, int> mp;
    vector<int> Pre, In;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        Pre = preorder, In = inorder;
        int n = Pre.size();
        for(int i = 0; i < n; i++) mp[In[i]] = i;
        return dfs(0, n-1, 0, n-1);
    }
    TreeNode* dfs(int pL, int pR, int inL, int inR){
        if(pL > pR) return nullptr;
        auto root = new  TreeNode(Pre[pL]);
        int k = mp[root->val];
        int left = k - inL;
        root->left = dfs(pL+1, pL + left, inL, k - 1);
        root->right = dfs(pL + left + 1, pR, k + 1, inR);
        return root;
    }
};

 

发布了106 篇原创文章 · 获赞 113 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_41598072/article/details/104347990