|
| 1 | +# c++ |
| 2 | +```cpp |
| 3 | +/** |
| 4 | + * Definition for a binary tree node. |
| 5 | + * struct TreeNode { |
| 6 | + * int val; |
| 7 | + * TreeNode *left; |
| 8 | + * TreeNode *right; |
| 9 | + * TreeNode(int x) : val(x), left(NULL), right(NULL) {} |
| 10 | + * }; |
| 11 | + */ |
| 12 | +class Solution { |
| 13 | +public: |
| 14 | + TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { |
| 15 | + return buildTree(preorder, inorder, 0, preorder.size()-1, 0, inorder.size()-1); |
| 16 | + } |
| 17 | + |
| 18 | + /**重载这个函数*/ |
| 19 | + //表示 前序为preorder,从下标p_l到p_r,中序为inorder,下标从i_l到i_r构建 树 |
| 20 | + TreeNode* buildTree(vector<int>& preorder, vector<int> inorder, int p_l, int p_r, int i_l, int i_r) { |
| 21 | + if(p_l > p_r) return NULL; |
| 22 | + if(p_l == p_r) return new TreeNode(preorder[p_l]); |
| 23 | + int index = find(inorder, i_l, i_r, preorder[p_l]);//根节点在中序遍历中的位置 |
| 24 | + TreeNode* node = new TreeNode(preorder[p_l]); |
| 25 | + int pre_left_len = index - i_l;//左子树的长度 |
| 26 | + // preorder[p_lo+1 ... p_lo+pre_left_len]是先序数组中与现结点左子树对应的部分。 |
| 27 | + // inorder[i_lo ... index_in-1]是中序数组中与现结点左子树对应的部分。 |
| 28 | + node->left = buildTree(preorder, inorder, p_l+1, p_l+pre_left_len, i_l, index - 1); |
| 29 | + node->right = buildTree(preorder, inorder, p_l+pre_left_len+1, p_r, index+1, i_r); |
| 30 | + return node; |
| 31 | + } |
| 32 | + |
| 33 | + int find(vector<int>& inorder, int l, int r, int node_val) { |
| 34 | + for(int i =l;i <= r;i++){ |
| 35 | + if(inorder[i] == node_val) return i; |
| 36 | + } |
| 37 | + return -1; |
| 38 | + } |
| 39 | +}; |
| 40 | +``` |
0 commit comments