hot100 -- 二叉树(中)

每个题目都用 2~3 种解法做出来,太费时间了,以后只用 1~2 种解法....

目录

🌼有序数组转二叉搜索树

AC  二分递归

🚩验证二叉搜索树

AC  递归

🌼二叉搜索树中的第 k 小元素

AC  中序遍历 -- 栈

🎂二叉树的右视图

AC  层序遍历

🥤二叉树展开为链表

AC  辅助数组


🌼有序数组转二叉搜索树

108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

二叉搜索树 -- 中序遍历(左-根-右)升序

左子树 < 根 < 右子树

查 和 增删改,都是 O(logn)

本题只涉及 Insert() 和 Create()

如果数组是无序的,插入 n 个元素,每次插入 O(logn),总的时间复杂度就是 O(nlogn)

但是本题是有序的...

AC  二分递归

数组升序,直接二分,时间 O(n) -- 每个节点只访问 1 次;空间 O(logn) -- 递归栈深度

/**
 * 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* sortedArrayToBST(vector<int>& nums) {
        int n = nums.size();
        return dfs(0, n-1, nums);
    }
    TreeNode* dfs(int l, int r, vector<int>& nums) {\
        // 递归出口
        if (l > r) return nullptr;

        int mid = (l + r) >> 1;
        TreeNode* T = new TreeNode(nums[mid]); // 根

        // 记得赋值
        T->left = dfs(l, mid - 1, nums); // 递归左子树
        T->right = dfs(mid + 1, r, nums); // 递归右子树

        return T;
    }
};

🚩验证二叉搜索树

98. 验证二叉搜索树 - 力扣(LeetCode)

AC  递归

引入了最大值 upper(LONG_MAX) 和最小值 lower(LONG_MIN),避免每次判断时,还需要讨论左右子树

更新时,将最大 / 小值,更新为当前节点的 root->val

递归左子树,更新最大值 upper

递归右子树,更新最小值 lower

函数参数:helper(root, lower, upper)

时间 O(n) -- 每个节点访问 1 次;空间 O(n) -- 递归栈深度,即二叉树高度,最坏一长条

/**
 * 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:
    bool helper(TreeNode* root, long long l, long long r) {
        // 递归出口
        if (!root)
            return true;
        if (root->val <= l || root->val >= r) // 超过区间范围
            return false;
        
        return helper(root->left, l, root->val) 
            && helper(root->right, root->val, r);
    }

    bool isValidBST(TreeNode* root) {
        return helper(root, LONG_MIN, LONG_MAX);
    }
};

🌼二叉搜索树中的第 k 小元素

230. 二叉搜索树中第K小的元素 - 力扣(LeetCode)

AC  中序遍历 -- 栈

栈实现中序遍历,通过 k-- 找到第 k 小元素,k == 0 时输出 root->val

1)内层 while 找到最左节点,即最小节点

2)遍历最小节点右子树 root->right

重复上述 1) 2)

中间遇到的节点,依次入栈,以便后续回溯

/**
 * 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:
    int kthSmallest(TreeNode* root, int k) {
        stack<TreeNode*> st;
        // 循环 -- 直到所有节点都遍历过
        while (root || !st.empty()) {
            // 找到最左节点
            while (root) {
                st.push(root);
                root = root->left;
            }
            root = st.top();
            st.pop(); // 升序出栈
            k--; 
            if (k == 0) 
                break;

            root = root->right; // 遍历最小节点--右子树
        }
        return root->val;
    }
};

时间 O(H + k),H 为二叉树高度。平衡树时,H == logN;线性树,H == N

所以时间 O(logN + k) ~ O(N + k)

空间 O(H),同样,根据平衡树 ~ 线性树,O(logN) ~ O(N) 

🎂二叉树的右视图

199. 二叉树的右视图 - 力扣(LeetCode)

AC  层序遍历

自顶向下,找每层的最右节点,层序遍历...

通过 int size 统计每层元素个数,只输出最后一个

时空 O(n)

/**
 * 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:
    vector<int> ans;
    vector<int> rightSideView(TreeNode* root) {

        queue<TreeNode*> q; // 借助队列实现 bfs 层序遍历

        if (!root) 
            return ans;
        q.push(root); // 根节点入队

        int size = 1; // 第1层节点数

        // 一层一层拓展
        while (!q.empty()) {
            // 取队头
            TreeNode* node = q.front();
            q.pop();
            size--;
            // 拓展左右子树
            if (node->left)
                q.push(node->left);
            if (node->right)
                q.push(node->right);
            // 插入本层最后一个节点
            if (size == 0) {
                ans.push_back(node->val);
                size = q.size();
            }
        }

        return ans;
    }
};

🥤二叉树展开为链表

114. 二叉树展开为链表 - 力扣(LeetCode)

AC  辅助数组

vector 保存先序遍历得到的节点,然后 for 循环:

节点->left = nullptr;  节点->right = 下一节点

第 19 行

TreeNode *pre = vec[i - 1], *cur = vec[i];

声明在 for 循环里,避免了对 0,1 个元素的讨论,n >= 2 才能进入 for 循环

时空 O(n) 

/**
 * 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:
    void flatten(TreeNode* root) {
        vector<TreeNode*> vec;
        preorder(root, vec);
        int n = vec.size();
        for (int i = 1; i < n; ++i) {
            TreeNode *pre = vec[i - 1], *cur = vec[i];
            pre->left = nullptr;
            pre->right = cur;
        }
    }
    void preorder(TreeNode* r, vector<TreeNode*> &v) {
        if (!r)
            return; // 递归出口
        // 先序遍历:根->左->右
        v.push_back(r);
        preorder(r->left, v);
        preorder(r->right, v);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/609242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QX------mini51单片机学习------(5)数码管的静态与动态显示

目录 1数码管应用场景 2数码管显示原理 3静态与动态显示 474HC573锁存器工作原理 5上拉电阻的作用 6原理图分析 7实践 1数码管应用场景 2数码管显示原理 图&#xff08;b&#xff09;左边是共阴极&#xff0c;右边是共阳极 GND是公共极&#xff0c;可以用万用表测&am…

C盘文件清理

WinSxS里面的文件是不可删除的。WinSxS下有很多重要的组件&#xff0c;版本也很繁杂&#xff0c;为了保证Windows的正常运行&#xff0c;请确保这些文件一个都不能少。这些文件支撑着mscorwks.dll&#xff0c;没有它们&#xff0c;mscorwks也无法加载。强行删除后可能只有以安全…

NASA数据集——全球土壤顶部 1 厘米土壤湿度的网格估算值25km分辨率

AMSR-E/Aqua L2B Surface Soil Moisture, Ancillary Parms, & QC EASE-Grids V003 简介 该数据集包含土壤顶部 1 厘米土壤湿度的网格估算值&#xff0c;是 AMSR-E 检索足迹的平均值。土壤湿度是通过 AMSR-E/Aqua L2A亮度温度&#xff08;Tb&#xff09;测量值估算的&…

远程连接是什么?

远程连接是指通过网络连接两个或多个设备&#xff0c;实现远程访问、控制或传输数据的技术。它在现代科技发展中起到了重要作用&#xff0c;使得我们可以随时随地与远程设备进行交互、管理和操作。 天联组网是一种高效的远程连接解决方案&#xff0c;它因为操作简单、跨平台应用…

「51媒体」教育论坛会议媒体邀约的资源有哪些

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 中国拥有众多教育方面的媒体资源&#xff0c;这些媒体在邀约时可以用于宣传和推广教育活动、论坛或项目。以下是一些具体的教育媒体邀约资源&#xff1a; 报纸类媒体&#xff1a; 《中…

MySQL库操作 表操作【详细解析】

MySQL MySQL是一个数据库软件 mysql mysql是一个“客户端—服务器”结构的软件 (1) a.客户端&#xff1a;主动发起请求的一方&#xff08;Client&#xff09; b.服务器&#xff1a;被动接收请求的一方&#xff08;Server&#xff09; 客户端和服务器之间通过网络 进行通信 (…

【Stylus详解与引入】

文章目录 Stylus详解与引入一、Stylus简介二、Stylus的特性1. 变量2. 嵌套规则3. 混合&#xff08;Mixins&#xff09;4. 函数5. 条件语句和循环 三、Stylus的引入与配置1. 安装Stylus和stylus-loader2. 配置Webpack3. 在Vue项目中使用Stylus4. 编译Stylus代码四、Stylus的性能…

美国商务部公布数字孪生技术投资计划

文章目录 前言一、主要内容二、相关背景‍‍‍‍前言 5月6日,美国商务部公布了一项价值2.85亿美元的投资计划,这项名为《美国芯片制造研究竞标》(CHIPS Manufacturing USA Institute Competition)的投资计划旨在向符合条件的申请者进行征求招标,协调建立和运营美国芯片制…

LeetCode-2079. 给植物浇水【数组 模拟】

LeetCode-2079. 给植物浇水【数组 模拟】 题目描述&#xff1a;解题思路一&#xff1a;简单的模拟题&#xff0c;初始化为0&#xff0c;考虑先不浇灌每一个植物解题思路二&#xff1a;初始化为n&#xff0c;考虑每一个植物需要浇灌解题思路三&#xff1a;0 题目描述&#xff1a…

量子城域网建设设备系列(三):网络管理系统(NMS)

在量子保密通信网络中&#xff0c;需要对整个网络的设备进行集中管理和统一维护。主要包括对设备的状态监控、异常告警的采集分析、拓扑管理、设备参数配置、业务策略控制等功能。基于这些需求&#xff0c;在实际的工程应用中&#xff0c;我们通常采用量子网络管理系统&#xf…

Java找不到包解决方案

在跟着教程写Spingboot后端项目时&#xff0c;为了加快效率&#xff0c;有时候有的实体文件可以直接粘贴到目录中&#xff0c;此时运行项目会出现Java找不到包的情况&#xff0c;即无法找到导入的实体文件&#xff0c;这是项目没有更新的原因。解决方法&#xff1a; 刷新Maven:…

详解Java Google Guava

详细介绍 Google Guava是Google为Java开发的开源库集合&#xff0c;它提供了丰富的工具类和集合框架的扩展&#xff0c;旨在提高开发效率和代码质量。Guava包括但不限于集合操作、并发编程辅助、缓存机制、字符串处理、I/O操作、原生类型支持、常见算法实现、函数式编程支持、测…

力扣每日一题- 给植物浇水 II -2024.5.9

力扣题目&#xff1a;给植物浇水 II 题目链接: 2105.给植物浇水 II 题目描述 代码思路 根据题目内容&#xff0c;使用双指针从左右两边同时向中间移动&#xff0c;模拟浇水过程即可。 代码纯享版 class Solution {public int minimumRefill(int[] plants, int capacityA, …

FANUC机器人单轴零点标定时提示无法执行零点标定,由于重力补偿已启用,所有机器人轴的脉冲计数必须有效

FANUC机器人单轴零点标定时提示无法执行零点标定,由于重力补偿已启用,所有机器人轴的脉冲计数必须有效 首先,机器人由于长时间断电未使用,6个轴的编码器数据全部丢失,上电后报警SRVO-062, 有关SRVO-062故障报警的相关内容可参考以下链接: FANUC机器人SRVO-062报警原因分…

windows11如何设置无线网卡不休眠

为了在家里用向日葵等软件连接上公司的台式电脑&#xff0c;发现尴尬的事情&#xff1a;在家里连接时提示公司的电脑下线了。经排查&#xff0c;发现长时间不用时&#xff0c;公司的台式电脑的无线网卡休眠了。 windows11可以用下面的步骤设置无线网卡不休眠&#xff1a; 1. 设…

Sybase数据库分页查询(指定起始位置)

针对单表数据量过大的场景&#xff0c;分页查询必不可少。针对sybase数据库分页查询的案例全网稀少&#xff0c;特别是指定起始页的分页查询实现。 本文依靠实际开发场景&#xff0c;特此总结Sybase数据库分页查询&#xff08;指定起始位置&#xff09;。 目录 一、 SQL实现分…

SQL统计语句记录

1.达梦数据库 统计指定单位的12个月份的业务数据 SELECT a.DEPT_ID, b.dept_name, a.USER_NAME, count(a.dept_id) as count, sum(case when to_char(a.CREATE_TIME,yyyy-mm) 2023-01 THEN 1 else 0 end) as one,sum(case when to_char(a.CREATE_TIME,yyyy-mm) 2023-02 T…

JavaScript手写专题——图片懒加载、滚动节流、防抖手写

图片懒加载场景&#xff1a;在一些图片量比较大的网站&#xff08;比如电商网站首页&#xff0c;或者团购网站、小游戏首页等&#xff09;&#xff0c;如果我们尝试在用户打开页面的时候&#xff0c;就把所有的图片资源加载完毕&#xff0c;那么很可能会造成白屏、卡顿等现象&a…

内网安全-隧道技术SSHDNSICMPSMB上线通讯LinuxMac 简单总结

第126天&#xff1a;内网安全-隧道技术&SSH&DNS&ICMP&SMB&上线通讯Linux&Mac_内网安全-隧道技术_ssh_dns_icmp_smb_上线通讯linux_mac-CSDN博客 内网渗透—隧道技术_隧道技术csdn-CSDN博客 #SMB 隧道&通讯&上线 判断&#xff1a;445 通讯 上…

Azure Windows2012升级2016

Azure Windows2012升级2016 在自己电脑配置Azure PowerShell前置条件PowerShell 登录到 Azure Azure 中运行 Windows Server 的 VM 的就地升级前置条件&#xff0c;生成一块OS磁盘将生成的OS磁盘附件到需升级的服务器执行就地升级到 Windows Server 2016 升级后配置故障恢复 在…
最新文章