当前位置: 首页 > news >正文

二叉树题目合集(C++)

二叉树题目合集

    • 1.二叉树创建字符串(简单)
    • 2.二叉树的分层遍历(中等)
    • 3.二叉树的最近公共祖先(中等)
    • 4.二叉树搜索树转换成排序双向链表(中等)
    • 5.根据树的前序遍历与中序遍历构造二叉树(中等)

1.二叉树创建字符串(简单)

链接:二叉树创建字符串

题目要求:
在这里插入图片描述

PS:题目描述的不是特别清楚,其实就是前序遍历树,然后用括号分别包含左子树和右子树遍历结果

基础思路:
(1)不考虑括号去重的话,其实只要访问完当前节点后递归访问左右子树即可,并且在访问前加左括号,访问完毕后加右括号,当前节点为空时返回即可。代码如下:

class Solution {
public:string ret;string tree2str(TreeNode* root) {dfs(root);return ret;}void dfs(TreeNode* root){if(root == nullptr)  return;ret += to_string(root->val);ret += '(', dfs(root->left), ret += ')';ret += '(', dfs(root->right), ret += ')';}
};

在这里插入图片描述


(2) 对于括号去重,主要围绕左右子树为空,我们需要分情况讨论:
在这里插入图片描述


代码:

class Solution {
public:string ret;string tree2str(TreeNode* root) {dfs(root);return ret;}void dfs(TreeNode* root){if(root == nullptr)  return;ret += to_string(root->val);if(root->left || root->right)  ret += '(', dfs(root->left), ret += ')';if(root->right)  ret += '(', dfs(root->right), ret += ')';}
};



2.二叉树的分层遍历(中等)

链接:二叉树的分层遍历

题目要求:
在这里插入图片描述


基础思路:
(1) 二叉树层序遍历的思想其实很简单,就是借助队列,父节点带出子节点,依靠队列先进先出的特点控制访问顺序
在这里插入图片描述

(2) 这个题目的关键点在于如何得知当前层和下一层的节点数,因为我们需要每一层都构建一个数组来存储结果。这里采用的解决方案是用一个next变量记录下一层的节点数,count(count初始为1)记录当前层的节点数,当前层访问完把next赋给count即可。


代码:

class Solution {
public:vector<vector<int>> ret;vector<vector<int>> levelOrder(TreeNode* root) {if(root == nullptr)  return ret;queue<TreeNode*> q;q.push(root);int count = 1;  //每一层的节点数while(!q.empty()){vector<int> tmp;int next = 0;  //用一个变量记录下一层的节点for(int i = 0; i < count; i++){TreeNode* node = q.front();q.pop();tmp.push_back(node->val);      if(node->left)  q.push(node->left), next++;   if(node->right)  q.push(node->right), next++;           }count = next;ret.push_back(tmp);}return ret;}
};



3.二叉树的最近公共祖先(中等)

链接:二叉树的最近公共祖先
题目要求:
在这里插入图片描述

  1. 解法一(时间复杂度高):
    基础思路:
    在这里插入图片描述

解法一代码:

//理想是N*logN,对于退化成链表的情况变成O(N ^ N)
class Solution {
public:bool isTree(TreeNode* root, TreeNode* x){if(root == nullptr)  return false;if(root->val == x->val)  return true;return isTree(root->left, x) || isTree(root->right, x);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == p || root == q)  return root;bool pInLeft = isTree(root->left, p);bool pInRight = !pInLeft;  //不在左树就在右树bool qInLeft = isTree(root->left, q);bool qInRight = !qInLeft;if((pInLeft && qInRight) || (pInRight && qInLeft))  //p,q分别在左右子树return root;if(pInLeft && qInLeft)  return lowestCommonAncestor(root->left, p, q); //pq都在左树else  return lowestCommonAncestor(root->right, p, q);  //pq都在右树}
};

  1. 解法二(时间复杂度低):
    基础思路:
    第二种思路也不是很难,将根到p,q节点的路径找出来从后向前找相交的节点即可,这样不好理解,还是看图:
    在这里插入图片描述

解法二代码:

//找路径,转换为链表交点,用栈来存储路径,O(N)
class Solution {
public:bool FindPath(TreeNode* root, TreeNode* x, stack<TreeNode*>& path){if(root == nullptr)  return false;path.push(root); //不管怎么说,先入栈if(root == x)  return true;if(FindPath(root->left, x, path))  return true;  //递归走左找到了,直接返回if(FindPath(root->right, x, path))  return true;  //递归走右找到了,直接返回//左右子树都没有,当前这个节点出栈path.pop(); return false;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> path1;stack<TreeNode*> path2;FindPath(root, p, path1);FindPath(root, q, path2);while(path1.size() != path2.size())  //长路径先走{if(path1.size() > path2.size())  path1.pop();else  path2.pop();}while(path1.top() != path2.top()){path1.pop(), path2.pop();}return path1.top();  //随便返回一个即可}
};



4.二叉树搜索树转换成排序双向链表(中等)

链接:二叉树搜索树转换成排序双向链表

题目要求:
在这里插入图片描述

基础思路:
(1)因为是搜索树,我们采用类似中序遍历的方式解题。
(2)这个题的关键在于找前置节点,只要找到当前节点的前置就可以进行链接。

具体过程如下:

  1. 两个指针,prev记录前置,cur记录当前,prev初始为空
  2. cur为空,返回。
  3. (1)cur非空,先递归走左;
    (2)左走完后prev就是前置,链接:cur->left = prev,prev->right = cur(这里prev非空)。
    (3)链接完毕后更新前置,prev = cur
    (4)左走完,递归右,链接右子树。
  4. 最后需要确定链表头节点,这个可以
    ①转换前找:树的最左下角的节点
    ②转换后找:从原根部节点一直向左即可。

先一路递归向左走到空
在这里插入图片描述

代码:

class Solution {
public:void _Convert_order(TreeNode* cur, TreeNode*& prev){if(cur == nullptr)  return;_Convert_order(cur->left, prev);cur->left = prev;if(prev)  prev->right = cur;prev = cur;_Convert_order(cur->right, prev);}TreeNode* Convert(TreeNode* pRootOfTree) {TreeNode* cur = pRootOfTree, *prev = nullptr;_Convert_order(cur, prev);TreeNode* ret = pRootOfTree;while(ret && ret->left)  //(1)有空树的情况(2)先链接好再向左找目标节点即可{ret = ret->left;}return ret;}
};



5.根据树的前序遍历与中序遍历构造二叉树(中等)

链接:构造二叉树

题目要求:
在这里插入图片描述

基础思路:
(1)前序定根,中序定左右
(2)先构造根,然后找到当前节点在中序数组的位置,把左右子树的节点划分出来。
(3)依据划分出的中序区间递归走左和右,区间不存在说明这个位置为空,返回空。
左右走完后链接起来即可。左右链接好了返回该树的根部节点

处理细节:
(1)怎么找到当前节点在中序数组的位置:
①一种方式是遍历中序区间,这样每一层都需要遍历,时间复杂度高
②一种是用哈希表进行存储,用值映射中序下标,时间复杂度低。
本文选择方式②。

前序遍历的过程走一下这个过程:
在这里插入图片描述


代码:

class Solution {
public:unordered_map<int, int> ord;TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder, int& prei, int inbegin, int inend){if(inbegin > inend)  return nullptr;  //区间不存在返回空TreeNode* root = new TreeNode(preorder[prei]);int rooti = ord[preorder[prei++]];//划分出三段区间:[inbegin, rooti - 1] rooti [rooti + 1, inend]root->left = _buildTree(preorder, inorder, prei, inbegin, rooti - 1);root->right = _buildTree(preorder, inorder, prei, rooti + 1, inend);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {for(int i = 0; i < inorder.size(); i++){ord[inorder[i]] = i;}int i = 0;return _buildTree(preorder, inorder, i, 0, inorder.size() - 1);}
};

相关文章:

二叉树题目合集(C++)

二叉树题目合集 1.二叉树创建字符串&#xff08;简单&#xff09;2.二叉树的分层遍历&#xff08;中等&#xff09;3.二叉树的最近公共祖先&#xff08;中等&#xff09;4.二叉树搜索树转换成排序双向链表&#xff08;中等&#xff09;5.根据树的前序遍历与中序遍历构造二叉树&…...

dbeaver配置es连接org.elasticsearch.xpack.sql.jdbc.EsDriver

查看目标es服务版本&#xff0c;下载对应驱动...

有监督学习线性回归

1、目标分析&#xff08;回归问题还是分类问题&#xff1f;&#xff09; 2、获取、处理数据 3、创建线性回归模型 4、训练模型 5、模型测试 x_data [[6000, 58], [9000, 77], [11000, 89], [15000, 54]] # 样本特征数据 y_data [30000, 55010, 73542, 63201] # 样本目标数…...

如何在vscode中添加less插件

Less &#xff08;Leaner Style Sheets 的缩写&#xff09; 是一门向后兼容的 CSS 扩展语言。它对CSS 语言增加了少许方便的扩展&#xff0c;通过less可以编写更少的代码实现更强大的样式。但less不是css&#xff0c;浏览器不能直接识别&#xff0c;即浏览器无法执行less代码&a…...

mediapipe 训练自有图像数据分类

参考&#xff1a; https://developers.google.com/mediapipe/solutions/customization/image_classifier https://colab.research.google.com/github/googlesamples/mediapipe/blob/main/examples/customization/image_classifier.ipynb#scrollToplvO-YmcQn5g 安装&#xff1a…...

【pytorch】torch.gather()函数

dim0时 index[ [x1,x2,x2],[y1,y2,y2],[z1,z2,z3] ]如果dim0 填入方式为&#xff1a; index[ [(x1,0),(x2,1),(x3,2)][(y1,0),(y2,1),(y3,2)][(z1,0),(z2,1),(z3,2)] ]input [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12] ] # shape&#xff08;3,4&#xff09; input torch.…...

Mac 安装psycopg2,报错Error: pg_config executable not found.

在mac 上安装psycopg2的方法&#xff1a;执行&#xff1a;pip3 install psycopg2-binary。 如果执行pip3 install psycopg2&#xff0c;无法安装psycopg2 报错信息如下&#xff1a; Collecting psycopg2Using cached psycopg2-2.9.9.tar.gz (384 kB)Preparing metadata (set…...

域名系统 DNS

DNS 概述 域名系统 DNS(Domain Name System)是因特网使用的命名系统&#xff0c;用来把便于人们使用的机器名字转换成为 IP 地址。域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢&#xff1f;这是因为在这种因特网的命名系统中使用了许多的“域(domain)”&#x…...

Vue $nextTick 模板解析后在执行的函数

this.$nextTick(()>{ 模板解析后在执行的函数 })...

VBA技术资料MF76:将自定义颜色添加到调色板

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…...

zilong-20231030

1)k个反转 2)n&#xff01;转12进制 求末尾多少0 一共有几位 &#xff08;考虑了溢出问题&#xff09; 3)大量数据获取前10个 4)reemap地城结构 5)红黑树规则特性 6)热更 7)压测 8)业务 跨服实现 9)有哪些线程以及怎么分配...

目标检测算法发展史

前言 比起图像识别&#xff0c;现在图片生成技术要更加具有吸引力&#xff0c;但是要步入AIGC技术领域&#xff0c;首先不推荐一上来就接触那些已经成熟闭源的包装好了再提供给你的接口网站&#xff0c;会使用别人的模型生成一些图片就能叫自己会AIGC了吗&#xff1f;那样真正…...

React 生成传递给无障碍属性的唯一 ID

useId() 在组件的顶层调用 useId 生成唯一 ID&#xff1a; import { useId } from react; function PasswordField() { const passwordHintId useId(); // ...参数 useId 不带任何参数。 返回值 useId 返回一个唯一的字符串 ID&#xff0c;与此特定组件中的 useI…...

十种排序算法(1) - 准备测试函数和工具

1.准备工作 我们先写一堆工具&#xff0c;后续要用&#xff0c;不然这些写在代码里可读性巨差 #pragma once #include<stdio.h>//为C语言定义bool类型 typedef int bool; #define false 0 #define true 1//用于交互a和b inline void swap(int* a, int* b) {/*int c *a…...

IRF联动 BFD-MAD

文章目录 IRF堆叠一、主设备配置二、备设备配置三、验证 MAD检测一、MAD检测二、MAD验证 本实验以2台设备进行堆叠示例&#xff0c;按照配置顺序&#xff0c;先配置主设备&#xff0c;再配置备设备。在IRF配置前暂时先不接堆叠线&#xff0c;按步骤提示接线。 IRF堆叠 一、主设…...

双向链表的初步练习

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇: Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”…...

IDE的组成

集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务…...

项目解读_v2

1. 项目介绍 如果使用task2-1作为示例时&#xff0c; 运行process.py的过程中需要确认 process调用的是函数 preprocess_ast_wav2vec(wav, fr) 1.1 任务简介 首个开源的儿科呼吸音数据集&#xff0c; 通过邀请11位医师标注&#xff1b; 数字听诊器的采样频率和量化分辨率分…...

杀毒软件哪个好,杀毒软件有哪些

安全杀毒软件是一种专门用于检测、防止和清除计算机病毒、恶意软件和其他安全威胁的软件。这类软件通常具备以下功能&#xff1a; 1. 实时监测&#xff1a;通过实时监测计算机系统&#xff0c;能够发现并防止病毒、恶意软件等安全威胁的入侵。 2. 扫描和清除&#xff1a;可以…...

Ubuntu上安装配置Nginx

要在 Ubuntu 上安装 Nginx&#xff0c;请按照以下步骤进行操作&#xff1a; 打开终端&#xff1a;可以使用快捷键 Ctrl Alt T 打开终端&#xff0c;或者在开始菜单中搜索 “Terminal” 并点击打开。 更新软件包列表&#xff1a;在终端中运行以下命令&#xff0c;以确保软件包…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...

第2课 SiC MOSFET与 Si IGBT 静态特性对比

2.1 输出特性对比 2.2 转移特性对比 2.1 输出特性对比 器件的输出特性描述了当温度和栅源电压(栅射电压)为某一具体数值时,漏极电流(集电极电流...

论文笔记:Large Language Models for Next Point-of-Interest Recommendation

SIGIR 2024 1 intro 传统的基于数值的POI推荐方法在处理上下文信息时存在两个主要限制 需要将异构的LBSN数据转换为数字&#xff0c;这可能导致上下文信息的固有含义丢失仅依赖于统计和人为设计来理解上下文信息&#xff0c;缺乏对上下文信息提供的语义概念的理解 ——>使用…...