• 代码随想录算法训练营第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. };

  • 相关阅读:
    双十一到了,当我用Python采集了电商平台所有商品后发现....
    springboot系列(十四):如何实现发送图片、doc文档等附件邮件?你一定得会|超级详细,建议收藏
    入行测试一年半的心得体会
    计算机毕业设计ssm+vue基于微信的产品订单管理小程序
    leetcode 118.杨辉三角形
    TDengine 成功“晋级” Percona Live 2023 银牌赞助商,开发者驻足关注
    Windows Defender防火墙配置错误与GPO:梳理关键点
    三维地图(3D地图)离线地图开发
    电脑如何录屏?推荐3个方法
    ECharts实现数据可视化入门教程(超详细)
  • 原文地址:https://blog.csdn.net/weixin_42179093/article/details/133779488