【LeetCode】105. 從前序與中序遍歷序列構造二叉樹 結題報告 (C++)
阿新 • • 發佈:2018-12-09
題目描述:
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
例如,給出
前序遍歷 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; } };