中后题干:
-
第一步:如果数组大小为零的话,说明是空节点了。
-
第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。
-
第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点
-
第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
-
第五步:切割后序数组,切成后序左数组和后序右数组
-
第六步:递归处理左区间和右区间
代码:
class Solution {
private:TreeNode* traversal(vector<int>& inorder, vector<int>& postorder){if(postorder.size() == 0)return NULL;int rootvalue = postorder[postorder.size() - 1];TreeNode* root = new TreeNode(rootvalue);if(postorder.size() == 1)return root;int index;for(index = 0; index < inorder.size(); index++){if(inorder[index] == rootvalue)break;}vector<int> leftinorder(inorder.begin(), inorder.begin() + index);vector<int> rightinorder(inorder.begin() + index + 1, inorder.end());//postorder.pop_back();postorder.erase(postorder.end() - 1);vector<int> leftpostorder(postorder.begin(), postorder.begin() + leftinorder.size());vector<int> rightpostorder(postorder.begin() + leftinorder.size(), postorder.end());root -> left = traversal(leftinorder, leftpostorder);root -> right = traversal(rightinorder, rightpostorder);return root;}
public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if(postorder.size() == 0)return NULL;return traversal(inorder, postorder); }
};
题干:
代码:
class Solution {
private:TreeNode* traversal(vector<int>& preorder, vector<int>& inorder){if(preorder.size() == 0) return NULL;int rootvalue = preorder[0];TreeNode* root = new TreeNode(rootvalue);if(preorder.size() == 1) return root;int index;for(index = 0; index < inorder.size(); index++){if(inorder[index] == rootvalue) break;}vector<int> leftinorder(inorder.begin(), inorder.begin() + index);vector<int> rightinorder(inorder.begin() + index + 1, inorder.end());preorder.erase(preorder.begin());vector<int> leftpreorder(preorder.begin(), preorder.begin() + leftinorder.size());vector<int> rightpreorder(preorder.begin() + leftinorder.size(), preorder.end());root->left = traversal(leftpreorder, leftinorder);root->right = traversal(rightpreorder, rightinorder);return root;}
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {if(preorder.size() == 0) return NULL;return traversal(preorder, inorder);}
};
注意,在删除“中”的时候选用erase(),传入erase的参数是迭代器,也就是begin()和end(),比如在中后序构造树中需要在切割后序vector前移除末尾元素“中”,而end()是指最后一个的后一位,所以需要-1来前移一位,所以是postorder.erase(postorder.end - 1);在前中序构造二叉树中也需要在切割前序vector前去除开头元素“中”,而begin()指的是开头,故为preorder.erase(preorder.begin())。