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


    目录

    一、(leetcode 654)最大二叉树

    二、(leetcode 617)合并二叉树

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

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


    一、(leetcode 654)最大二叉树

    力扣题目地址

    状态:AC。

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

    1. class Solution {
    2. public:
    3.     TreeNode* traversal(vector<int>& nums, int begin, int end){
    4.         if(begin == end) { return nullptr; }
    5.         int max_num = INT_MIN, max_index = begin;
    6.  
    7.         // 确定最大值的索引
    8.         for(int i = begin; i < end; ++i){
    9.             if(max_num < nums[i]){
    10.                 max_num = nums[i];
    11.                 max_index = i;
    12.             }
    13.         }
    14.  
    15.         TreeNode* node = new TreeNode(max_num);
    16.  
    17.         // 进行左右子数组划分
    18.         int left_left = begin, left_right = max_index;
    19.         int right_left = max_index + 1, right_right = end;
    20.  
    21.         node->left = traversal(nums, left_left, left_right);
    22.         node->right = traversal(nums, right_left, right_right);
    23.  
    24.         return node;
    25.     }
    26.  
    27.     TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
    28.         return traversal(nums, 0, nums.size());
    29.     }
    30. };

    二、(leetcode 617)合并二叉树

    力扣题目链接

    状态:AC。

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

    1. class Solution {
    2. public:
    3.     TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
    4.         //进行前序遍历,如果两棵树都为空则返回空节点
    5.         if(root1 == nullptr && root2 == nullptr){
    6.             return nullptr;
    7.         }
    8.         TreeNode* node = new TreeNode(0);
    9.  
    10.         if(root1 != nullptr && root2 != nullptr){
    11.             node->val = root1->val + root2->val;
    12.             node->left = mergeTrees(root1->left, root2->left);
    13.             node->right = mergeTrees(root1->right, root2->right);
    14.         }else if(root1){
    15.             node->val = root1->val;
    16.             node->left = mergeTrees(root1->left, nullptr);
    17.             node->right = mergeTrees(root1->right, nullptr);
    18.         }else{
    19.             node->val = root2->val;
    20.             node->left = mergeTrees(nullptr, root2->left);
    21.             node->right = mergeTrees(nullptr, root2->right);
    22.         }
    23.  
    24.         return node;  
    25.     }
    26. };

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

    力扣题目地址

    状态:AC。

    简单的前序遍历比较

    1. class Solution {
    2. public:
    3.     TreeNode* searchBST(TreeNode* root, int val) {
    4.         if(root == nullptr) return nullptr;
    5.  
    6.         //前序遍历
    7.         if(root->val == val){
    8.             return root;
    9.         }else if(root->val < val){
    10.             return searchBST(root->right, val);
    11.         }else{
    12.             return searchBST(root->left, val);
    13.         }
    14.         
    15.         return nullptr;
    16.     }
    17. };

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

    力扣题目链接

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

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

    1. class Solution {
    2. public:
    3.     long long maxVal = LONG_MIN;
    4.     bool isValidBST(TreeNode* root) {
    5.         if(root == nullptr) return true;
    6.  
    7.         bool left = isValidBST(root->left);
    8.  
    9.         //中序遍历查看是否符合递增
    10.         if(root->val > maxVal){
    11.             maxVal = root->val;
    12.         }else{
    13.             return false;
    14.         }
    15.  
    16.         bool right = isValidBST(root->right);
    17.  
    18.         return left && right;
    19.     }
    20. };

  • 相关阅读:
    3D激光SLAM:ALOAM---gazebo仿真测试场景搭建
    微信小程序---软件学习(制作小程序软件的安装,创建第一个小程序)
    使用NetDevOps使您的网络现代化
    慢日志查询
    pom.xml
    数据集的整理和命名和格式转换
    Python异步编程之web框架 异步vs同步 数据库IO任务并发支持对比
    Android RecyclerView原理语法和用法
    监控易机房运维大屏:打造高效机房管理的新标杆
    神经网络重建治疗仪原理,神经网络修复视频教程
  • 原文地址:https://blog.csdn.net/weixin_42179093/article/details/133779488