二叉树——105. 从前序与中序遍历序列构造二叉树

时间:2021-04-12 12:33:14   收藏:0   阅读:0

二叉树——105. 从前序与中序遍历序列构造二叉树

题目:

技术图片

思路:

这题就是考察两种遍历的特点,前序遍历的第一个为root结点,知道了root结点,就可以在中序遍历中知道在root结点之前的为左子树,在root结点之后的为右子树。然后就可以递归的构造出左子树和右子树。

具体实现的时候,就是要借助哈希表去在中序遍历中找root的位置。

代码:

class Solution {
private:
    unordered_map<int, int> index;
public:
    TreeNode* mybuildTree(const vector<int>& preorder, const vector<int>& inorder, int preStart, int preEnd,int inStart, int inEnd){
        if(preStart > preEnd || inStart > inEnd) return nullptr;
        // 前序遍历中的第一个节点就是根节点
        TreeNode* root = new TreeNode(preorder[preStart]);
        // 找到中序遍历中根节点的位置
        int inRoot = index[root->val];
        // 确定左子树数量
        int numsleft = inRoot - inStart;
        // 递归构造左子树
        // 要注意的位置都是前序遍历和中序遍历中左子树的部分,所以要注意位置
        root->left = mybuildTree(preorder, inorder, preStart+1, preStart+numsleft, inStart, inRoot-1);
        // 递归构造右子树
        // 位置注意同理左子树部分
        root->right = mybuildTree(preorder, inorder, preStart+numsleft+1, preEnd, inRoot+1, inEnd);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size();
        // 构造哈希映射,快速定位根节点
        for(int i = 0; i<n; i++){
            index[inorder[i]] = i;
        }
        return mybuildTree(preorder, inorder, 0, n-1, 0, n-1);
    }
};

Rank:

技术图片

Tips:

就是要熟悉前序和中序遍历的特点,先吃饭去了。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!