二叉树高频题目(不含树形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.mzph.cn/news/703760.shtml

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

相关文章

音视频技术-电脑连接调音台时交流声的产生与消除

当电脑&#xff08;笔记本/台式机&#xff09;声卡通过音频线与调音台&#xff08;或扩音机&#xff09;连接时&#xff0c;能听到“交流声”。有时很轻微&#xff0c;有时很明显&#xff0c;甚至干扰正常的演讲或发言。 很多时候&#xff0c;我们在台上演讲时&#xff0c;都会…

Centos7.9环境源码编译安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 2.未安装x264库则先安装配置 可以先查询x264库: whereis libx264 安装编译工具和依赖库&#xff1a; sudo yum install gcc make cmake mercurial git yasm pkgconfig autoconf automake libtool sudo…

UE4 材质多张图片拼接成一张图片(此处用2×2拼接)

UE4 材质多张图片拼接成一张图片&#xff08;此处用22拼接&#xff09; //TexCoord,TextureA,TextureB,TextureC,TextureDfloat3 ReturnTexture TextureA; if(TexCoord.x < 0.5 && TexCoord.y < 0.5) {ReturnTexture TextureA; } else if(TexCoord.x > 0.5…

力扣1290. 二进制链表转整数

Problem: 1290. 二进制链表转整数 文章目录 题目描述思路复杂度Code 题目描述 思路 1.记录一个变量res初始化为0&#xff0c;指针p指向链表头&#xff1b; 2.循环每次res res * 2 p -> val;p p -> next;&#xff08;充分利用二进制数的特性&#xff1b;其中利用指针先…

VMware使用虚拟机,开启时报错:无法连接虚拟设备 0:0,因为主机上没有相应的设备。——解决方法

检查虚拟机配置文件并确保物理设备已正确连接。 操作&#xff1a; 选中虚拟机&#xff0c;打开设置&#xff0c;点击CD/DVD。在连接处选择使用ISO镜像文件

.top域名解析超过72小时ping不通

域名作为网络上网站的唯一标识&#xff0c;它可以是可视的文本字符串&#xff0c;也可以是IP地址&#xff0c;它提供了一种方便的方式来访问网站&#xff0c;而不用担心网址的改变。域名可以分为不同的类型&#xff0c;如顶级域名(TLD)、国家域名(ccTLD)、通用域名(gTLD)等。因…

怎样知道员工上班浏览了哪些网页

在数字化时代&#xff0c;员工在工作时间内上网浏览网页已经成为常态。然而&#xff0c;这也为企业带来了信息安全和工作效率的隐患。为了解决这个问题&#xff0c;许多企业开始使用域智盾这样的专业软件来监控员工的上网行为。 一、域智盾软件简介 域智盾是一款功能强大的企业…

操作系统--设备管理

一、设备控制器 我们的电脑设备可以接非常多的输入输出设备&#xff0c;比如键盘、鼠标、显示器、网卡、硬盘、打印机、音响等等&#xff0c;每个设备的用法和功能都不同。为了屏蔽设备之间的差异&#xff0c;每个设备都有一个叫设备控制器&#xff08;Device Control&#xf…

电子书推荐|IT 基础架构团队的 K8s 管理(含最新性能评测)

越来越多的企业采用 Kubernetes 支持应用的快速开发与交付&#xff0c;Kubernetes 的部署与管理任务也逐渐向 IT 基础架构团队倾斜。尤其是对于习惯了传统虚拟化环境的基础架构工程师&#xff0c;容器环境的管理方式往往会带来诸多困扰&#xff1a; Kubernetes 使用门槛高&…

期权无风险套利策略[6]—看跌期权价格波动区间套利

看跌期权价格波动区间定义 根据美式看涨和看跌期权的均衡公式&#xff0c;在无现金股利的发放下&#xff1a; &#xff08;1&#xff09;美式看跌期权的价格&#xff08;P&#xff09;一定不会超过同等特征美式看涨期权的价格 &#xff08;C&#xff09;&#xff0c;加上执行…

React18源码: Fiber树的初次创建过程图文详解

fiber树构造&#xff08;初次创建&#xff09; fiber树构造的2种情况&#xff1a; 1.初次创建 在React应用首次启动时&#xff0c;界面还没有渲染此时并不会进入对比过程&#xff0c;相当于直接构造一棵全新的树 2.对比更新 React应用启动后&#xff0c;界面已经渲染如果再次发…

面试经典150题【31-40】

文章目录 面试经典150题【31-40】76.最小覆盖字串36.有效的数独54.螺旋矩阵48.旋转图像73.矩阵置零289.生命游戏383.赎金信205.同构字符串290.单词规律242.有效的字母异位词 面试经典150题【31-40】 76.最小覆盖字串 基本思路很简单&#xff0c;就是先移动右边到合适位置。再移…

面对耦合度过高的第三方对接

今天接到一个需求&#xff0c;原型图如下&#xff1a;抖音数据&#xff08;给的是数据占比&#xff09;&#xff0c;要求根据性别&#xff0c;年龄&#xff0c;类目&#xff0c;地域&#xff0c;消费偏好&#xff0c;客单价筛选后排序。 1、性别给的示例&#xff1a;{ "…

Rem 自适应原理与应用

前言 移动端适配有很多方案&#xff0c;这篇文章将根据 rem 自适应的原理进行讲解&#xff0c;接下来跟着作者的思路一起来看看吧&#xff01; 原理 在搞清楚 rem 适配之前&#xff0c;我们先来了解一下什么是 rem&#xff1f; rem 是一种相对长度单位&#xff0c;它相对于根…

51单片机学习(5)-----蜂鸣器的介绍与使用

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 目录 一. 蜂鸣器的介绍 1.蜂鸣器介绍 2.压电式蜂鸣器 &#xff08;无源…

LeetCode 第一题: 两数之和

文章目录 第一题: 两数之和题目描述示例 解题思路Go语言实现 - 一遍哈希表法C实现算法分析 排序和双指针法Go语言实现 - 排序和双指针法C算法分析 暴力法Go语言实现 - 暴力法C算法分析 二分搜索法Go语言实现 - 二分搜索法C算法分析 第一题: 两数之和 ‍ 题目描述 给定一个整…

6.2 认证授权模块 - 继承JWT、网关认证

认证授权模块 - 继承JWT、网关认证 文章目录 认证授权模块 - 继承JWT、网关认证一、JWT1.1 普通令牌1.2 JWT 令牌介绍1.3 测试生成JWT 令牌1.3.1 TokenConfig1.3.2 授权服务器配置 AuthorizationServer1.3.3 WebSecurityConfig 安全管理配置1.3.4 返回信息 1.4 资源服务集成 JW…

《乱弹篇(十九)围炉诗话》

闲来无事&#xff0c;近日浏览中国古代文学书藉&#xff0c;读罢《新嫁娘词》中的一首五言绝句诗&#xff0c;觉得妙趣横生&#xff0c;艺术造诣甚高。今天恰逢春潮寒意还浓&#xff0c;气温很低&#xff0c;笔者雅兴勃发&#xff0c;便开足暖气&#xff0c;也附庸风雅地来一番…

WSL2配置Linux、Docker、VS Code、zsh、oh my zsh(附Docker开机自启设置)

0. 写在前面 本篇笔记来自于UP主麦兜搞IT的合集视频Windows10开发环境搭建中的部分内容 1. 安装WSL2 按照微软官方文档进行操作&#xff0c;当然也可以直接wsl --install 也可以按照 旧版手动安装的步骤 来进行操作 选择安装的是Ubuntu 20.04 LTS 注&#xff1a;WSL默认安装…

抖音视频提取软件使用功能|抖音视频下载工具

我们的抖音视频提取软件是一款功能强大、易于操作的工具&#xff0c;旨在解决用户在获取抖音视频时需要逐个复制链接、下载的繁琐问题。我们的软件支持通过关键词搜索和分享链接两种方式获取抖音视频&#xff0c;方便用户快速找到自己感兴趣的内容。 主要功能模块&#xff1a;…