重建二叉树

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

 

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

3
/ \
9 20
/ \
15 7

#include "vector"
#include "iostream"


using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;

    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
        int length = preorder.size();
        if (length == 0)
            return nullptr;
        int rootValue = preorder[0];
        TreeNode *node = new TreeNode(rootValue);
        int lfEnd;
        for (lfEnd = 0; inorder[lfEnd] != rootValue; ++lfEnd);

        if (lfEnd == 0)
            node->left = nullptr;
        else {
            vector<int> prelf(preorder.begin() + 1, preorder.begin() + 1 + lfEnd);
            vector<int> inlf(inorder.begin(), inorder.begin() + lfEnd);
            node->left = buildTree(prelf, inlf);
        }
        if (length - 1 == lfEnd)
            node->right = nullptr;
        else {
            vector<int> prerg(preorder.begin() + lfEnd + 1, preorder.end());
            vector<int> inrg(inorder.begin() + lfEnd + 1, inorder.end());
            node->right = buildTree(prerg, inrg);
        }

        return node;
    }
};

int main() {
    Solution s;
    vector<int> pre{3, 9, 20, 15, 7};
    vector<int> in{9, 3, 15, 20, 7};
    s.buildTree(pre, in);
}

 

posted on 2021-05-09 09:39  QzZq  阅读(117)  评论(0)    收藏  举报

导航