二叉树高频题目(不含树形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;其中利用指针先…

C++前言..

1.前言 C主要从三个模块讲起 分别是&#xff1a;语法(包括底层汇编)、面向对象以及项目实战 C语言纯面向过程 而Java纯面向对象 但是C则是一门面向过程和面向对象都较为完善的语言 并且他能做到Java所不能做到的点就是他更能够窥探底层的汇编代码 而Java是一点都不想透露给外…

leetcode初级算法(python)- 字符串

文章目录 1.反转字符串常规算法pythonic 算法2.整数反转数学法字符串法3.字符串中的第一个唯一字符pythonic算法哈希算法4.有效的字母异位词常规算法进阶算法5.最长公共前缀1.反转字符串 输入:[‘h’,‘e’,‘l’,‘l’,‘o’] 输出:[‘o’,‘l’,‘l’,‘e’,‘h’]

LeetCode 第三题: 无重复字符的最长子串

文章目录 题目描述示例 解题思路 - 滑动窗口法Go语言实现 - 滑动窗口法算法分析 解题思路 - 优化的滑动窗口法 题目描述 给定一个字符串&#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串…

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 使用门槛高&…

分布式缓存简介

分布式缓存是一种用于存储和访问大量数据的系统&#xff0c;其数据在多个缓存节点&#xff08;也称为服务器或实例&#xff09;之间分布和复制。这种架构的主要目的是提高性能和可扩展性&#xff0c;同时提供数据冗余和高可用性。 以下是分布式缓存的主要特点和优势&#xff1…

期权无风险套利策略[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;界面已经渲染如果再次发…

12.openEuler用户和群组

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议安装麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 1.用户和组管理 用户的基础概念: Linux是一个多用户多任务的操作系统: Linux系统支持多个用户在同一时间…

改善C++程序与设计的55个具体做法——2.尽量以const,enum,inline替换#define

const和#define 这个条款或许改为“宁可以编译器替换预处理器”比较好&#xff0c;因为或许#define不被视为语言的一部分。那正是它的问题所在。当你做出这样的事情&#xff1a; #define ASPECT RATIO 1.653 记号名称ASPECT_RATIO也许从未被编译器看见&#xff1b;也许在编译…

面试经典150题【31-40】

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

SOP、SLA、SOA傻傻分不清?

SOP&#xff08;Standard Operating Procedure&#xff09; SOP 是 “Standard Operating Procedure” 的缩写&#xff0c;中文意思是“标准操作流程”。它是组织内部规定的一套标准化的工作流程或操作指南&#xff0c;目的是确保工作或任务以统一、高效、安全的方式完成。SOP…

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

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