代码随想录算法训练营第26天|LeetCode106.中序和后序遍历构造二叉树、LeetCode617.合并二叉树
1、LeetCode654.最大二叉树
第一想法
就是递归呗,照着它的逻辑写。先找到最大值然后再分割。原则是“左闭右开”。
代码
犯错:
- 注意要一直遵循左闭右开原则/左闭右必原则
- 在两个数之间找最大值可以用max()
- 在vector的某一段区间内找最大值用
max_element(vec.begin(), vec.end())
,注意是左闭右开,并且返回值是一个迭代器因此需要*it才能获取其值。
其实整体还是写得比较快的。
class Solution {
public:
TreeNode* travesal(vector<int>& nums, int begin, int end){
// 递归结束条件
if(end <= begin) return NULL;
// 单层逻辑
// 1 找到最大值
int maxx = *(max_element(nums.begin()+begin, nums.begin()+end)); //?是这样找吗?
int max_idx = find(nums.begin()+begin, nums.begin()+end, maxx) - nums.begin();
// 2 创建根节点
TreeNode* root = new TreeNode(maxx);
// 3 递归构建
root->left = travesal(nums, begin, max_idx);
root->right = travesal(nums, max_idx+1, end);
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if(nums.size() == 0) return NULL;
return travesal(nums, 0, nums.size());//左闭右开
}
};
2、LeetCode617.合并二叉树
第一想法(递归法)
也就是同时递归遍历两个二叉树,然后判断情况。
也是先序遍历
代码
一遍过!感觉自己最近递归的代码写得都挺不错的哈哈哈
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
// 若有一边为空,则直接返回另外一棵树
if(!root1) return root2;
if(!root2) return root1;
// root都有值
TreeNode* root = new TreeNode(root1->val + root2->val);
root->left = mergeTrees(root1->left, root2->left);
root->right = mergeTrees(root1->right, root2->right);
return root;
}
};
迭代法
没想过用这个。下面是代码,也挺好理解的其实,就是把递归放在一个函数里面。
迭代法那就是层序遍历了。
代码
好吧看起来简单但敲一遍之后还是有要注意的地方:
- 原理不是生成一颗新的树,而是把root2往root1身上加,因此最终返回的是root1
- 因此,t1左为空时直接把t2左赋值过去;t1左不为空而t2左为空时无需操作。
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
// 法2 迭代
if(!root1) return root2;
if(!root2) return root1;
queue<TreeNode*> que;
que.push(root1);
que.push(root2);
// 实际上是返回t1
while(!que.empty()){
TreeNode* t1 = que.front();
que.pop();
TreeNode* t2 = que.front();
que.pop();
t1->val += t2->val;
if(t1->left && t2->left){
que.push(t1->left);
que.push(t2->left);
}
if(t1->right && t2->right){
que.push(t1->right);
que.push(t2->right);
}
// t1左节点为空,右节点不为空的情况,需要赋值
// t1左不为空,右为空的情况不需要处理,因为要返回的就是t1.
if(!t1->left && t2->left){
t1->left = t2->left;
}
if(!t1->right && t2->right){
t1->right = t2->right;
}
}
return root1;
}
};
总结:
- max_element()函数的用法