代码随想录
递归思路:
一:通过先序和后序来构建二叉树。
二:先序遍历、找到中间节点,然后分为左树、右树、通过根节点递归构建。
三:代码随想录三步走
1:很明显没有思路,就按2的根、左子树、右子树。然后思考返回值就是节点。通过先序数组、后序数组来构造,可以直接用题目给定的函数形式。
2:此时很明显满足问题的情况不明确。此时就直接分为根的情况,左子树构建,右子树构建。
根的情况:根空、根为叶子
左子树构建:要知道左子树的中序数组和先序数组。
先序数组第一个即为根,通过根来将中序数组划分为左子树、中、右子树。此时就得到了左子树的中序数组,右子树的中序数组,中序数组我们都切成了左中序数组和右中序数组了,那么先序数组就可以按照左子树中序数组的大小来切割,切成左先序数组和右先序数组。
通过以上就可以完成左子树的中序数组和先续数组,右子树的中序数组和先序数组。
代码:
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(inorder.size() == 0) return nullptr;
int a = preorder[0];
TreeNode* node = new TreeNode(a);
if(inorder.size() == 1) return node;
int i;
for(i = 0; i < inorder.size(); i++){
if(inorder[i] == a) break;
}
preorder.erase(preorder.begin());
vector<int>leftinorder(inorder.begin(), inorder.begin()+i);
vector<int>rightinorder(inorder.begin()+i+1, inorder.end());
vector<int>leftpreorder(preorder.begin(), preorder.begin()+leftinorder.size());
vector<int>rightpreorder(preorder.begin()+leftinorder.size(), preorder.end());
node->left = buildTree(leftpreorder,leftinorder);
node->right = buildTree(rightpreorder,rightinorder);
return node;
}
};
题106删除末尾元素是:
resize是设置大小,设置容量所以可以等同于删除末尾元素。
postorder.resize(postorder.size()-1);
题105删除首元素是:
erase才是删除元素函数
preorder.erase(preorder.begin());
题105 erase的使用:
删除迭代器位置处的单个字符, 并返回下个元素的迭代器
iterator erase(const_iterator position)
删除迭代器[first, last)区间的所有字符,返回一个指向被删除的最后一个元素的下一个字符的迭代器。
iterator erase(const_iterator first, const_iterator last)