代码随想录算法训练营第26天|LeetCode106.中序和后序遍历构造二叉树、LeetCode617.合并二叉树

代码随想录算法训练营第26天|LeetCode106.中序和后序遍历构造二叉树、LeetCode617.合并二叉树

1、LeetCode654.最大二叉树

654. 最大二叉树 - 力扣(LeetCode)

请添加图片描述

第一想法

就是递归呗,照着它的逻辑写。先找到最大值然后再分割。原则是“左闭右开”。

代码

犯错:

  • 注意要一直遵循左闭右开原则/左闭右必原则
  • 在两个数之间找最大值可以用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.合并二叉树

617. 合并二叉树 - 力扣(LeetCode)

请添加图片描述

第一想法(递归法)

也就是同时递归遍历两个二叉树,然后判断情况。

也是先序遍历

代码

一遍过!感觉自己最近递归的代码写得都挺不错的哈哈哈

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()函数的用法
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值