代码随想录训练营Day20

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

今天是跟着代码随想录训练营刷题的第20天,今天主要学习了654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树这四个内容
链接地址:最大二叉树合并二叉树二叉搜索树中的搜索验证二叉搜索树。


提示:以下是本篇文章正文内容,下面案例可供参考

一、654.最大二叉树

思路:这道题就是给你一个数组,让你按照里面最大的树为根,左子树和右子树同理。所以先找到数组里面最大的当做根节点,把左右分成两个数组,然后左边和右边再迭代,相同的方法再找最大的当根节点。
代码:

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
    if(nums.size()==0) return NULL;
    int index=0;
    int maxvalue=nums[0];
    int i=0;
    for(;i<nums.size();i++)
    {
        if(nums[i]>maxvalue)
        {
            maxvalue=nums[i];
            index=i;
        }
    }
    TreeNode* root=new TreeNode(maxvalue);
    vector<int> left(nums.begin(),nums.begin()+index);
    vector<int> right(nums.begin()+index+1,nums.end());
    root->left=constructMaximumBinaryTree(left);
    root->right=constructMaximumBinaryTree(right);
    return root;
    }
};

二、合并二叉树

思路:如果root1的左边空的,就返回右边,如果root1的右边空的就返回左边,然后如果都不空,就返回两个的值之和就好了,然后左边右边分别用递归。
代码:

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
    if(root1==NULL) return root2;
    if(root2==NULL) return root1;
    TreeNode* root=new TreeNode(0);
    root->val=root1->val+root2->val;
    root->left=mergeTrees(root1->left,root2->left);
    root->right=mergeTrees(root1->right,root2->right);
    return root; 
    }
};

三、二叉搜索树中的搜索

迭代法思路:很简单,就是对比这个节点的值和目标值哪个大,因为是二叉搜索树,数值大小是比较有规律的。当然前提是节点不为空。
迭代法代码:

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) { 
    while(root!=NULL)
    {
        if(root->val>val) root=root->left;
        else if(root->val<val) root=root->right;
        else break;
    }
    return root;
 
    }
};

递归法思路:同样在节点不为空的情况下,如果相等了就返回root,如果不相等,大了小了分别调用递归就行了。

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root == NULL || root->val == val) return root;
        TreeNode* result = NULL;
        if (root->val > val) result = searchBST(root->left, val);
        if (root->val < val) result = searchBST(root->right, val);
        return result;
    }
};

四、验证二叉搜索树

二叉搜索树其实就是根节点大于左子树又要大于右子树,注意是大于左子树的全部,并不是大于左节点就可以了,一种直接的方法就是把二叉树进行一个遍历写成一个数组的形式,然后判断数组是不是单调递增的就可以了,但是这种方法比较麻烦,我们看到二叉搜索树要想到中序遍历,我们可以在中序遍历的迭代中判断就好了,最好的还是用双指针,后面比较前面的更加方便
双节点法:

class Solution {
public:
    TreeNode* pre=NULL;
    bool isValidBST(TreeNode* root) {
    if(root==NULL) return true;
    bool left=isValidBST(root->left);
    if(pre!=NULL&&pre->val>=root->val)
    {
        return false;
    }
    pre=root;
    bool right=isValidBST(root->right);
    return left&&right;

    }
};

这里注意节点要定义在最前面,不然每经历一次递归,节点都变成NULL了
暴力解法:

class Solution {
public:
    void faker(TreeNode* root,vector<int>& result)
    {
        if(root==NULL) return;
        
        faker(root->left,result);
        result.push_back(root->val);
        faker(root->right,result);
    }
    bool isValidBST(TreeNode* root) {
    vector<int> result;
    faker(root,result);
    if(result.size()>1)
    {
        for(int i=0,j=1;i<result.size()-1;i++,j++)
        {
            if(result[j]>result[i]) continue;
            else return false;
        }
        return true;
    }
    else return true;
    
   
    }
};

这里注意vector& result不能用值传递,因为值传递不改变本身result的值,只有用引用传递才能把函数中的修改反映到result上。

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值