二叉树高频题目(不含树形DP)

二叉树高频题

二叉树的层序遍历

. - 力扣(LeetCode)

按点弹出

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>>ans;if(root!=nullptr){queue<TreeNode*>q;unordered_map<TreeNode*,int>levels;q.push(root);levels[root]=0;while(!q.empty()){auto cur=q.front();q.pop();int level=levels[cur];if(ans.size()==level){ans.push_back(vector<int>());}ans[level].push_back(cur->val);if(cur->left!=nullptr){q.push(cur->left);levels[cur->left]=level+1;}if(cur->right!=nullptr){q.push(cur->right);levels[cur->right]=level+1;}}}return ans;}
};

按层弹出

/*** 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<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>>ans;if(root!=nullptr){queue<TreeNode*>q;q.push(root);while(!q.empty()){int size=q.size();vector<int>tmp;for(int i=0;i<size;i++){auto cur=q.front();q.pop();tmp.push_back(cur->val);if(cur->left!=nullptr){q.push(cur->left);}if(cur->right!=nullptr){q.push(cur->right);}}ans.push_back(tmp);}  }return ans;}
};

二叉树的锯齿形遍历

/*** 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) {}* };*/const int N=2222;class Solution {TreeNode* q[N];
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>>ans;if(root!=nullptr){int l=0,r=0;q[r++]=root;bool reverse=false;  //false 左->右while(l<r){int levelSize=r-l;vector<int>curLevel;for(int i=reverse?r-1:l,j=reverse?-1:1,k=0;k<levelSize;k++,i+=j){auto cur=q[i];curLevel.push_back(cur->val);}for(int i=0;i<levelSize;i++){auto cur=q[l++];if(cur->left!=nullptr)q[r++]=cur->left;if(cur->right!=nullptr)q[r++]=cur->right;}ans.push_back(curLevel);reverse=!reverse;}}return ans;}
};

二叉树的最大特殊宽度

/*** 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) {}* };*/
const int N=3333;
typedef unsigned long long LL;
class Solution {TreeNode* nq[N];LL iq[N];
public:int widthOfBinaryTree(TreeNode* root) {LL ans=1;int l=0,r=0;nq[r]=root;iq[r++]=1;while(l<r){int levelSize=r-l;ans=max(ans,iq[r-1]-iq[l]+1);for(int i=0;i<levelSize;i++){auto cur=nq[l];LL id=iq[l++];if(cur->left!=nullptr){nq[r]=cur->left;iq[r++]=id*2;}if(cur->right!=nullptr){nq[r]=cur->right;iq[r++]=id*2+1;}}}return (int)ans;}
};

二叉树的最大深度

二叉树的最小深度

二叉树的序列化和反序列化

先序

class Codec {
public:// Encodes a tree to a single string.string serialize(TreeNode* root) {ostringstream out;serialize(root,out);return out.str();}void serialize(TreeNode* node, ostringstream& out) {if(!node)out<<"#,";else{out<<node->val<<',';serialize(node->left,out);serialize(node->right,out);}}TreeNode* deserialize(string data) {istringstream in(data);return deserialize(in);}TreeNode* deserialize(istringstream& in) {string val;if(!getline(in,val,','))return nullptr;if(val=="#")return nullptr;TreeNode* node=new TreeNode(stoi(val));node->left=deserialize(in);node->right=deserialize(in);return node;}};

中序没有序列化

层序

class Codec {
public:// 序列化std::string serialize(TreeNode* root) {std::string data;if (root != nullptr) {std::queue<TreeNode*> q;q.push(root);while (!q.empty()) {TreeNode* node = q.front();q.pop();if (node != nullptr) {data += std::to_string(node->val) + ",";q.push(node->left);q.push(node->right);} else {data += "#,";}}}return data;}// 反序列化TreeNode* deserialize(const std::string& data) {if (data.empty()) return nullptr;std::stringstream ss(data);std::string item;getline(ss, item, ',');TreeNode* root = new TreeNode(std::stoi(item));std::queue<TreeNode*> q;q.push(root);while (!q.empty()) {TreeNode* node = q.front();q.pop();if (!getline(ss, item, ',')) break;if (item != "#") {node->left = new TreeNode(std::stoi(item));q.push(node->left);}if (!getline(ss, item, ',')) break;if (item != "#") {node->right = new TreeNode(std::stoi(item));q.push(node->right);}}return root;}
};

已知先序和中序建树

/*** 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* buildTree(vector<int>& preorder, vector<int>& inorder) {if(preorder.empty()||inorder.empty()||preorder.size()!=inorder.size()){return nullptr;}unordered_map<int,int> mp;for(int i=0;i<inorder.size();i++){mp[inorder[i]]=i;}return f(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1,mp);}TreeNode* f(vector<int>&pre,int l1,int r1,vector<int>&in,int l2,int r2,unordered_map<int,int>mp){if(l1>r1)return nullptr;TreeNode* head=new TreeNode(pre[l1]);if(l1==r1)return head;int k=mp[pre[l1]];head->left=f(pre,l1+1,l1+k-l2,in,l2,k-1,mp);head->right=f(pre,l1+k-l2+1,r1,in,k+1,r2,mp);return head;}
};

验证完全二叉树

  • 完全二叉树:在一棵二叉树中,除了最后一层外,每一层都被完全填满,并且所有节点都尽可能地集中在左侧。

完全二叉树具有以下特性:

  1. 层级填充:除了最后一层,其他每一层的节点数都达到最大个数。
  2. 左侧偏重:最后一层的节点集中在左侧,这层的节点可能不是满的,但如果有空缺,那么空缺部分一定在右侧。
  3. 序号特性:如果将所有节点从上至下、从左至右编号,第i个节点的左子节点编号为2*i,右子节点编号为2*i+1(这里假设根节点编号为1)。这是因为完全二叉树可以用数组来顺序存储,且这种存储方式不会浪费空间。
/*** 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) {}* };*/const int N=333;
class Solution {TreeNode* q[N];
public:bool isCompleteTree(TreeNode* root) {if(root==nullptr)return true;int l=0,r=0;q[r++]=root;//是否遇到孩子不全的节点bool leaf=false;while(l<r){auto cur=q[l++];if((cur->left==nullptr&&cur->right!=nullptr)||(leaf&&(cur->left!=nullptr||cur->right!=nullptr))){return false;}if(cur->left!=nullptr)q[r++]=cur->left;if(cur->right!=nullptr)q[r++]=cur->right;if(cur->left==nullptr||cur->right==nullptr)leaf=true;}return true;}
};

求完全二叉树节点个数

. - 力扣(LeetCode)

满二叉树公式

k=h第k层的结点数是:2^(k-1); 总结点数是:2^k-1 (2的k次方减一),总节点数一定是奇数

递归思路

如果能扎到最深层 则是满二叉树

如果不能扎到最深层

串一遍

时间复杂度

/*** 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 countNodes(TreeNode* root) {if(root==nullptr)return 0;return f(root,1,mostLeft(root,1));}//cur当前节点//level当前层//h最深层数int f(TreeNode* cur,int level,int h){if(level==h)return 1;//cur右树的最左节点能扎到最深层if(mostLeft(cur->right,level+1)==h){return (1<<(h-level))+f(cur->right,level+1,h);}else{return (1<<(h-level-1))+f(cur->left,level+1,h);}}int mostLeft(TreeNode* cur,int level){while(cur!=nullptr){level++;cur=cur->left;}return level-1;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遥感、航拍、影像等用于深度学习的数据集集合

遥感图像的纹理特征异常繁杂&#xff0c;地貌类型多变&#xff0c;人工提取往往存在特征提取困难和特征提取不准确的问题&#xff0c;同时&#xff0c;在这个过程中还会耗费海量的人力物力。随着计算力的突破、数据洪流的暴发和算法的不断创新&#xff0c;在具有鲜明“大数据”…

SpringBoot:自定义starter

点击查看&#xff1a;LearnSpringBoot08starter 点击查看&#xff1a;LearnSpringBoot08starterTest 点击查看更多的SpringBoot教程 一、主要流程 1. 先创建空的project 2. 打开空的project 结构 图选中model 点击 3. 创建 model&#xff08;Maven&#xff09;启动器 提…

Microsoft的PromptBench可以做啥?

目录 PromptBench简介 PromptBench的快速模型性能评估 PromptBench数据集介绍 PromptBench模型介绍 PromptBench模型加载遇到的问题 第一次在M1 Mac上加载模型 vicuna和llama系列模型 PromptBench各个模型加载情况总结 PromptBench的Prompt快速工程 chain of thought…

C++——二叉搜索树

二叉搜索树 二叉搜索树&#xff1a; 又为搜索二叉树&#xff0c;一般具有以下的性质 若它的左子树不为空&#xff0c;则左子树上所有的节点的值都小于父亲节点若它的右子树不为空&#xff0c;则右子树上所有的节点的值都大于父亲节点它的左右子树也都为二叉搜索树 二叉搜索树…

设计模式六:策略模式

1、策略模式 策略模式定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使每个算法可以相互替代&#xff0c;使算法本身和使用算法的客户端分割开来&#xff0c;相互独立。 策略模式的角色&#xff1a; 策略接口角色IStrategy&#xff1a;用来约束一系列具体…

基于SpringBoot的航班进出港管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

使用GPT生成python图表

首先&#xff0c;生成一脚本&#xff0c;读取到所需的excel表格 import xlrddata xlrd.open_workbook(xxxx.xls) # 打开xls文件 table data.sheet_by_index(0) # 通过索引获取表格# 初始化奖项字典 awards_dict {"一等奖": 0,"二等奖": 0,"三等…

消息中间件篇之Kafka-高性能设计

一、高性能设计 消息分区&#xff1a;不受单台服务器的限制&#xff0c;可以不受限的处理更多的数据。 顺序读写&#xff1a;磁盘顺序读写&#xff0c;提升读写效率。 页缓存&#xff1a;把磁盘中的数据缓存到内存中&#xff0c;把对磁盘的访问变为对内存的访问。 零拷贝&a…

计算机网络面经-从浏览器地址栏输入 url 到显示主页的过程?

大概的过程比较简单&#xff0c;但是有很多点可以细挖&#xff1a;DNS解析、TCP三次握手、HTTP报文格式、TCP四次挥手等等。 DNS 解析&#xff1a;将域名解析成对应的 IP 地址。TCP连接&#xff1a;与服务器通过三次握手&#xff0c;建立 TCP 连接向服务器发送 HTTP 请求服务器…

unity hub (第一部)初学配置

1、安装Unity Hub 2、设置中文 3、安装编辑器 4、新建项目 5、新建完成后进入编辑器 6、 编辑器设置中文 editPreferencesLanguages选择中文

2.22 作业

顺序表 运行结果 fun.c #include "fun.h" seq_p create_seq_list() {seq_p L (seq_p)malloc(sizeof(seq_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->len 0; bzero(L,sizeof(L->data)); return L; } int seq_empty(seq_p L) {i…

Linux第63步_为新创建的虚拟机添加必要的目录和安装支持linux系统移植的软件

1、创建必要的目录 输入密码“123456”&#xff0c;登录虚拟机 这个“zgq”&#xff0c;是用户名&#xff0c;也是下面用到的的“zgq”目录。 1)、创建“/home/zgq/linux/”目录 打开终端&#xff0c;进入“/home/zgq/”目录 输入“mkdir linux回车”&#xff0c;创建“/ho…

stream流-> 判定 + 过滤 + 收集

List<HotArticleVo> hotArticleVos hotArticleVoList .stream() .filter(x -> x.getChannelId().equals(wmChannel.getId())).collect(Collectors.toList()); 使用Java 8中的Stream API对一个名为hotArticleVoList的列表进行过滤操作&#xff0c;筛选出符合指定条件…

介绍 PIL+IPython.display+mtcnn for 音视频读取、标注

1. nn.NLLLoss是如何计算误差的? nn.NLLLoss是负对数似然损失函数&#xff0c;用于多分类问题中。它的计算方式如下&#xff1a;首先&#xff0c;对于每个样本&#xff0c;我们需要将其预测结果通过softmax函数转换为概率分布。softmax函数可以将一个向量映射为一个概率分布&…

linux前端部署

安装jdk 配置环境变量 刷新配置文件 source profile source /etc/profile tomcat 解压文件 进去文件启动tomcat 开放tomcat的端口号 访问 curl localhsot:8080 改配置文件 改IP,改数据库名字&#xff0c;密码&#xff0c; 安装数据库 将war包拖进去 访问http:…

解决IDEA git 提交慢的问题

文章目录 前言解决IDEA git 提交慢的问题 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! 解…

【stm32】hal库学习笔记-UART/USART串口通信(超详细!)

【stm32】hal库学习笔记-UART/USART串口通信 hal库驱动函数 CubeMX图形化配置 导入LCD.ioc RTC设置 时钟树配置 设置LSE为RTC时钟源 USART设置 中断设置 程序编写 编写主函数 /* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 16, "Demo12_1:USART1-CH340&q…

黑色金属冶炼5G智能工厂数字孪生可视化管控系统,推进金属冶炼行业数字化转型

黑色金属冶炼5G智能工厂数字孪生可视化管控系统&#xff0c;推进金属冶炼行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的必然趋势。金属冶炼行业作为传统工业的重要组成部分&#xff0c;也面临着数字化转型的挑战和机遇。为了推进金属冶炼行…

基于虚拟力优化的无线传感器网络覆盖率matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 虚拟力优化算法 4.2 覆盖覆盖率计算 5.完整程序 1.程序功能描述 基于虚拟力优化的无线传感器网络覆盖率&#xff0c;仿真输出优化前后的网络覆盖率&#xff0c;覆盖率优化收敛迭代曲线…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…