(2022.02.17)每日一题 二叉树
递归不仅要考虑开始情况也要仔细考虑收敛的情况。
昨天对于各种遍历的特性依旧思考的浅了些,如何利用不变的且简单的特性去确定边界是一个值得好好思考的问题,数组一定要充分利用其StartIndex和EndIndex,这样可以更快的去确定一个范围。
class Solution {
private:
unordered_map<int,int> num2index;
public:
TreeNode* constructFromPrePost(vector<int>& preorder, vector<int>& postorder) {
int size = preorder.size();
TreeNode* ans = new TreeNode();
for(int i = 0;i<size;i++){
num2index[preorder[i]] = i;
}
ans = convertTree(preorder,postorder,0,size-1,0,size-1);
return ans;
}
TreeNode* convertTree(vector<int>& preorder, vector<int>& postorder,int preStart,int preEnd,int postStart,int postEnd){
if(preStart == preEnd){
return new TreeNode(preorder[preStart]);
}
TreeNode* root = new TreeNode(preorder[preStart]);
//如果没有左子树的情况,或者没有右子树的情况,这就是为什么先序和后序无法确定一颗二叉树的原因
if(preorder[preStart+1] == postorder[postEnd-1]){
root->left = nullptr;
root->right = convertTree(preorder,postorder,preStart+1,preEnd,postStart,postEnd-1);
return root;
}
int left_size = num2index[postorder[postEnd-1]] - num2index[preorder[preStart+1]];
root->left = convertTree(preorder,postorder,preStart+1,preStart+left_size,postStart,postStart+left_size-1);
root->right = convertTree(preorder,postorder,preStart+left_size+1,preEnd,postStart+left_size,postEnd-1);
return root;
}
};