1020 Tree Traversals (25 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805485033603072
1086 Tree Traversals Again (25 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805380754817024
根据前序和中序遍历建树
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
TreeNode *buildTree(vector &preorder, vector &inorder) {
return create(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
}
TreeNode* create(vector& preorder, vector& inorder, int ps, int pe, int is, int ie){
if(ps > pe){
return nullptr;
}
TreeNode* node = new TreeNode(preorder[ps]);
int pos;
for(int i = is; i <= ie; i++){
if(inorder[i] == node->val){
pos = i;
break;
}
}
node->left = create(preorder, inorder, ps + 1, ps + pos - is, is, pos - 1);
node->right = create(preorder, inorder, pe - ie + pos + 1, pe, pos + 1, ie);
return node;
}
让我解释递归中的坐标。很简单,我们可以看到,按中序遍历分为两部分,[is,pos-1]和[pos+1,is]根据pos指向的根节点。第一部分包含pos - is个元素,第二部分包含ie- (pos +1)+1 = ie - pos个元素。 相应地,在前序遍历中,[ps+1,ps+pos - is]区间中的元素属于左子树,而[pe - (ie - pos)+1,pe]区间中的元素属于右子树。
根据中序和后序建树
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* create(vector inorder, vector postorder, int ib, int ie, int pb, int pe) {
if (pb > pe) {
return nullptr;
}
TreeNode* node = new TreeNode(postorder[pe]);
int pos;
for (int i = ib; i <= ie; i++) {
if (inorder[i] == node->val) {
pos = i;
break;
}
}
node->left = create(inorder, postorder, ib, pos - 1, pb, pb + pos - ib - 1);
node->right = create(inorder, postorder, pos + 1, ie, pe - ie + pos, pe - 1);
return node;
}
TreeNode* buildTree(vector inorder, vector postorder) {
return create(inorder, postorder, 0, inorder.size() - 1, 0, postorder.size() - 1);
}