1. 程式人生 > >【LeetCode】105. 從前序與中序遍歷序列構造二叉樹 結題報告 (C++)

【LeetCode】105. 從前序與中序遍歷序列構造二叉樹 結題報告 (C++)

題目描述:

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。

注意:
你可以假設樹中沒有重複的元素。

例如,給出

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

    3
   / \
  9  20
    /  \
   15   7

解題方案:

本題的關鍵是對vector進行拆分,拆分之後,就能進行遞迴。。優點是程式碼簡潔。。

我沒有找到很好的拆分方式,只是重新的生成新的容器。注意,容器使用完畢之後,有進行釋放記憶體。。因此,這種方式比較花費時間,效果不是很好。

/**
 * 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:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.size() == 0)
            return NULL;
        
        TreeNode* root = new TreeNode(preorder[0]);
        int loc = 0;
        while(preorder[0] != inorder[loc])  loc ++;
        
        vector<int> a(preorder.begin() + 1, preorder.begin() + 1 + loc);
        vector<int> b(inorder.begin(), inorder.begin() + loc);
        root->left = buildTree(a, b);
        a.clear();
        b.clear();
        
        vector<int> c(preorder.begin() + 1 + loc, preorder.end());
        vector<int> d(inorder.begin() + 1 + loc, inorder.end());
        root->right = buildTree(c, d);
        c.clear();
        d.clear();
        return root;
    }
};