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

99 阅读1分钟

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

思路

  1. 根据前序序列,可以划分中序左右树两个子序列
  2. 根据中序左右两个子序列,可以划分前序左右树两个子序列
  3. 递归两个子集,建立二叉树。
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.empty() || inorder.empty()) return nullptr;
        // 前序头,建树
        TreeNode *root = new TreeNode(*preorder.begin());
        // 找到中续遍历序列中 前序首个
        auto it = find(inorder.begin(), inorder.end(), *preorder.begin());
        // 根据前序头,拆分中序遍历序列
        vector<int> iLeft(inorder.begin(), it), iRight(it+1, inorder.end());
        // 根据拆分后的中序子序列,拆分前序序列
        vector<int> pLeft(preorder.begin() + 1, preorder.begin() + 1 + iLeft.size()), pRight(preorder.begin() + 1 + iLeft.size(), preorder.end());
        // 树的左右子结点构造
        root->left = buildTree(pLeft, iLeft);
        root->right = buildTree(pRight, iRight);
        return root;
    }
};