算法 DAY20 二叉树 || 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

news/2024/7/7 23:33:48

654.最大二叉树

蛮简单的,逻辑跟构造树基本一致

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
            if(nums.size() == 0) return nullptr;
            pair<int,int> root;
            root.first = INT_MIN; //root->val
            root.second = 0;  //root index
            for(int i = 0; i < nums.size(); ++i){
                if(nums[i] > root.first){
                    root.first = nums[i];
                    root.second = i;
                }
            }
            TreeNode* rootnode = new TreeNode(root.first);
            vector<int> left(nums.begin(),nums.begin() + root.second);
            vector<int> right(nums.begin() + root.second + 1, nums.end());
            rootnode->left = constructMaximumBinaryTree(left);
            rootnode->right = constructMaximumBinaryTree(right);
            return rootnode;
    }
};

注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。
优化版本:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return constructTree(nums,0,nums.size());
    }
    TreeNode* constructTree(vector<int>& nums,int left,int right) {
        if(left >= right) return nullptr;
        int index;
        int maxnum = INT_MIN;
        for(int i = left; i < right; ++i){
            if(nums[i] > maxnum){
                maxnum = nums[i];
                index = i;
            }
        }
        TreeNode* root = new TreeNode(maxnum);
        root->left = constructTree(nums,left, index);
        root->right = constructTree(nums,index+1,right);
        return root;
    }
};

617.合并二叉树

跟遍历一棵树是一样的,只不过要处理两棵树同一个地方的节点

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1 == nullptr && root2 == nullptr) return nullptr;
        else if(root1 != nullptr && root2 == nullptr) return root1;
        else if(root1 == nullptr && root2 != nullptr) return root2;
        
        int val = root1->val + root2->val;
        TreeNode* root = new TreeNode(val);
        
        root->left = mergeTrees(root1->left,root2->left);
        root->right = mergeTrees(root1->right,root2->right);

        return root;
    }
};

700.二叉搜索树中的搜索

二叉搜索树是一个有序树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

它的左、右子树也分别为二叉搜索树

递归法:

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if(root == nullptr || root->val == val) return root;

        TreeNode* res = nullptr;
        if(root->val > val) res = searchBST(root->left,val);
        if(root->val < val) res = searchBST(root->right,val);
        
        return res;
    }
};

对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。

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 return root;
        }
        return NULL;
    }
};

98.验证二叉搜索树

如果按照中序遍历,并且当前元素不大于上一个,就返回false的逻辑。是有漏洞的。没有考虑到只有一个或两个(中,左)节点的情况。
所以只能全部遍历,然后和前一个元素作比较

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        vector<int> vec;
        vec.clear();
        chek(root, vec);
        for(int i = 1; i < vec.size(); ++i){
            if(vec[i] <= vec[i-1]) return false;
        }
        return true;
    }
    void chek(TreeNode* root,vector<int>& vec){
        if(root == nullptr) return; 
        chek(root->left,vec);
        vec.push_back(root->val);
        chek(root->right,vec);
    }
};

http://lihuaxi.xjx100.cn/news/1001947.html

相关文章

医学影像系统弱监督语义分割集成的探索

Exploring Weakly Supervised Semantic Segmentation Ensembles for Medical Imaging Systems 摘要 利用复杂数据集的低质量CAM预测来提高结果的准确性使用低阈值CAMs以高确定性覆盖目标对象通过组合多个低阈值cam&#xff0c;在突出显示目标对象的同时均匀地消除它们的错误 …

【通过redis生成编码】生成不重复的序列号

/*** 生成一个序列号&#xff0c;每天从0开始自增* yyyyMMdd0001* Param leftCode编号特定前缀* */public String getSequence(String leftCode){SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyyMMdd");String dateTime simpleDateFormat.format(ne…

STM32F103引脚输入输出模式详解

目录 一&#xff1a;输入模式 1.1&#xff1a;模拟输入 1.2&#xff1a; 浮空输入 1.3&#xff1a;上拉输入 1.4&#xff1a;下拉输入 1.5&#xff1a; 为什么没有复用输入配置模式 二&#xff1a;输出模式 2.1&#xff1a;推挽输出 2.2&#xff1a;开漏输出 2.3&#xf…

并发情况下, 必须对iterator 进行加锁

java集合操作中, remove 元素请使用 Iterator 方式&#xff0c;如果并发操作&#xff0c;需要对 Iterator 对象加锁, 为什么并发情况下, 必须对iterator 进行加锁 在并发环境下&#xff0c;如果多个线程同时尝试访问同一个集合并且其中某个线程正在使用Iterator遍历该集合&…

【day2】Android Jetpack Compose环境搭建

【day2】Android Jetpack Compose环境搭建 以下是适用于 Jetpack Compose 的环境要求&#xff1a; Android Studio 版本&#xff1a;4.2 Canary 15 或更高版本Gradle 版本&#xff1a;7.0.0-beta02 或更高版本Android 插件版本&#xff1a;4.2.0-beta15 或更高版本Kotlin 版本…

C# 结构体

C#中的结构体&#xff08;Struct&#xff09;是一种轻量级的数据类型&#xff0c;用于存储数据。与类&#xff08;Class&#xff09;不同&#xff0c;结构体是一种值类型&#xff0c;即在赋值或传递参数时是按值传递的&#xff0c;而不是按引用传递的。 结构体的声明和使用方式…

docker push时出现denied: requested access to the resource is denied

1、首先确认自己已经登陆 docker login2、修改镜像到自己账户的名下 docker tag ${原镜像的名称} ${自己的账户名称}/${原镜像的名称} docker push ${自己的账户名称}/${原镜像的名称}

HTB-Popcorn

HTB-Popcorn信息收集开机提权信息收集 前1000个常用端口 全体端口 22 ssh OpenSSH 5.1p180 http Apache httpd 2.2.12 80端口的页面如下。 dirmap gobuster dirbuster 得出如下结果&#xff1a; 当前可访问 http://10.10.10.6/indexhttp://10.10.10.6/testhttp://10.1…