C++ 前序遍歷和中序遍歷重構二叉樹(劍指offer)
阿新 • • 發佈:2018-12-08
題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
這道題之前做過幾次,以前的做法比較粗暴,每次都會申請新的空間儲存前序遍歷和中序遍歷進行遞迴,這次做了一些改進,用兩個指標記錄新的中序遍歷前後端進行遞迴,可以節省空間。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void construct_tree(TreeNode *&node, vector<int> pre, vector<int> vin, int left, int right, int &i) { if (i >= (int)pre.size()) { return; } int k = left; for (;k <= right; k++) { if (pre[i] == vin[k]) { break; } } node = new TreeNode(pre[i]); if (k > left) { i++; construct_tree(node->left, pre, vin, left, k-1, i); } if (right > k) { i++; construct_tree(node->right, pre, vin, k+1, right, i); } } TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { TreeNode* root; if (pre.size() == 0) { return NULL; } int i = 0; construct_tree(root, pre, vin, 0, vin.size() - 1, i); return root; } };
這裡要注意的是
void construct_tree(TreeNode *&node, vector<int> pre, vector<int> vin, int left, int right, int &i)
這裡我用了指標引用,這裡折騰了我好久,因為以前都直接用指標,用指標引用比較少。用指標傳遞返回結果為空。大家可以試試。