代码随想录算法训练营第23期day19| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

目录

[一、(leetcode 654)最大二叉树](#一、(leetcode 654)最大二叉树)

[二、(leetcode 617)合并二叉树](#二、(leetcode 617)合并二叉树)

[三、(leetcode 700)二叉搜索树中的搜索](#三、(leetcode 700)二叉搜索树中的搜索)

[四、(leetcode 98)验证二叉搜索树](#四、(leetcode 98)验证二叉搜索树)


一、(leetcode 654)最大二叉树

力扣题目地址

状态:AC。

和昨天的中序+后/前序遍历序列构建二叉树思路类似,每次递归寻找数组中的最大值,根据最大值的索引来切分左右子序列进行递归生成,可以用索引下标来避免重复生成vector带来的开销

cpp 复制代码
class Solution {
public:
    TreeNode* traversal(vector<int>& nums, int begin, int end){
        if(begin == end) { return nullptr; }
        int max_num = INT_MIN, max_index = begin;
 
        // 确定最大值的索引
        for(int i = begin; i < end; ++i){
            if(max_num < nums[i]){
                max_num = nums[i];
                max_index = i;
            }
        }
 
        TreeNode* node = new TreeNode(max_num);
 
        // 进行左右子数组划分
        int left_left = begin, left_right = max_index;
        int right_left = max_index + 1, right_right = end;
 
        node->left = traversal(nums, left_left, left_right);
        node->right = traversal(nums, right_left, right_right);
 
        return node;
    }
 
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return traversal(nums, 0, nums.size());
    }
};

二、(leetcode 617)合并二叉树

力扣题目链接

状态:AC。

使用的方法可以AC但是不够简洁,留待后续改进

cpp 复制代码
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        //进行前序遍历,如果两棵树都为空则返回空节点
        if(root1 == nullptr && root2 == nullptr){
            return nullptr;
        }
        TreeNode* node = new TreeNode(0);
 
        if(root1 != nullptr && root2 != nullptr){
            node->val = root1->val + root2->val;
            node->left = mergeTrees(root1->left, root2->left);
            node->right = mergeTrees(root1->right, root2->right);
        }else if(root1){
            node->val = root1->val;
            node->left = mergeTrees(root1->left, nullptr);
            node->right = mergeTrees(root1->right, nullptr);
        }else{
            node->val = root2->val;
            node->left = mergeTrees(nullptr, root2->left);
            node->right = mergeTrees(nullptr, root2->right);
        }
 
        return node;  
    }
};

三、(leetcode 700)二叉搜索树中的搜索

力扣题目地址

状态:AC。

简单的前序遍历比较

cpp 复制代码
class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if(root == nullptr) return nullptr;
 
        //前序遍历
        if(root->val == val){
            return root;
        }else if(root->val < val){
            return searchBST(root->right, val);
        }else{
            return searchBST(root->left, val);
        }
        
        return nullptr;
    }
};

四、(leetcode 98)验证二叉搜索树

力扣题目链接

状态:思路错误,不能简单地比较根节点和左右子节点的大小。

这道题可以通过中序遍历的顺序判断值是不是递增来判断,注意除了上面的那个思路问题,在实现时用于比较的值maxVal需要使用long long来初始化,以防测试用例中有INT_MIN。

cpp 复制代码
class Solution {
public:
    long long maxVal = LONG_MIN;
    bool isValidBST(TreeNode* root) {
        if(root == nullptr) return true;
 
        bool left = isValidBST(root->left);
 
        //中序遍历查看是否符合递增
        if(root->val > maxVal){
            maxVal = root->val;
        }else{
            return false;
        }
 
        bool right = isValidBST(root->right);
 
        return left && right;
    }
};
相关推荐
Gorway1 天前
解析残差网络 (ResNet)
算法
拖拉斯旋风1 天前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect1 天前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
灵感__idea2 天前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect2 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP3 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱3 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub3 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉