本文最后更新于621 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
1.这个题难度不小,但是看了一遍视频,然后跟着文字的叙述还是可以自己跟着思路写出代码了,可能是我最近的练习也是小有成效了,这个题给我最关键的部分就是去切割后序和中序的数组,自己写的时候还在想,我难道需要把4个部分的左右的节点都分别放在一个数组里嘛,这样内存开销是不是太大了,结果还真是,做完这个题给我的感觉是我对于边界条件和剪枝,递归的结束条件等都有更深刻的简介了。相信自己也会对二刷更有信心啦。
CPP
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
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 delimiter = 0;
for(;delimiter < inorder.size() -1;delimiter ++ ){
if(rootValue == inorder[delimiter])break;
}
vector<int>leftInorder(inorder.begin() , inorder.begin() + delimiter);
vector<int>rightInorder(inorder.begin() + delimiter + 1 , inorder.end());
postorder.resize(postorder.size() - 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;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size() == 0 || postorder.size() == 0)return NULL;
return traversal(inorder , postorder);
}
};