codetop标签树刷题(四)!!暴打面试官!!!!

用于个人复习

  • 1.二叉树的右视图
  • 2.二叉树最大宽度
  • 3.二叉树的最大深度
  • 4.N叉树的最大深度
  • 5.二叉树的最小深度
  • 6.子树的最大平均值
  • 7.求根节点到叶节点的数字之和
  • 8.另一棵树的子树
  • 9.对称二叉树

1.二叉树的右视图

给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,从右侧所能看到的节点值。
在这里插入图片描述
BFS层序遍历,每一层最后一个节点就是二叉树的右侧视图,可以把BFS反过来,从右往左遍历每一行,进一步提升效率。在每一层的位置记录一下第一个

class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<int> res;if(root == nullptr) return res;queue<TreeNode*> q;q.push(root);while(!q.empty()){TreeNode* last = q.front();int size = q.size();for(int i = 0; i < size; i ++){TreeNode* cur = q.front();q.pop();if(cur->right != nullptr) q.push(cur->right);if(cur->left != nullptr) q.push(cur->left);}res.push_back(last->val);}return res;}
};

2.二叉树最大宽度

给你一棵二叉树的根节点 root ,返回树的 最大宽度 。

树的 最大宽度 是所有层中最大的 宽度 。

每一层的 宽度 被定义为**该层最左和最右的非空节点(即,两个端点)之间的长度。**将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。

题目数据保证答案将会在 32 位 带符号整数范围内。
在这里插入图片描述
本题的关键在于要给二叉树节点按行进行编号,然后就可以通过每一行的最左侧和最右侧节点的编号推算出这一行的宽度,进而算出最大宽度。
假设父节点的编号是 x,左子节点就是 2 * x,右子节点就是 2 * x + 1。这个特性常见于完全二叉树的题目当中。

使用一个结构体来记录下节点和对应的编号

class Solution {struct Pair{TreeNode* node;unsigned long long id;//int不够,编号都转换成unsigned long longPair(TreeNode* node, unsigned long long id) : node(node), id(id) {}};
public:int widthOfBinaryTree(TreeNode* root) {if(root == nullptr) return 0;unsigned long long maxWidth = 0;queue<Pair> q;q.push(Pair(root, 1));while(!q.empty()){int size = q.size();unsigned long long start = 0, end = 0;for(int i = 0; i < size; i ++){Pair cur = q.front();q.pop();TreeNode* curNode = cur.node;unsigned long long curId = cur.id;if(i == 0) start = curId;if(i == size - 1) end = curId;if(curNode->left != nullptr) q.push(Pair(curNode->left, curId * 2));if(curNode->right != nullptr) q.push(Pair(curNode->right, curId * 2 + 1));}maxWidth = max(maxWidth, end - start + 1);   //因为end - start + 1是unsigned long long类型,所以maxWidth也必须是这个类型才可以,或者将end - start + 1单独强制转换成int,static_cast<int>(end - start + 1)}return maxWidth;}
};

3.二叉树的最大深度

class Solution {
public:int res = 0;int maxDepth(TreeNode* root) {if(root == nullptr) return 0;int leftDepth = maxDepth(root->left);int rightDepth = maxDepth(root->right);res = max(leftDepth, rightDepth) + 1;return res;}
};

4.N叉树的最大深度

给定一个N叉树,找到其最大深度。

class Solution {
public:int maxDepth(Node* root) {if(root == nullptr) return 0;int subTreeMaxDepth = 0;for(Node* child : root->children) subTreeMaxDepth = max(subTreeMaxDepth, maxDepth(child));return 1 + subTreeMaxDepth;}
};

5.二叉树的最小深度

最小深度不能像最大深度一样用return 1 + min(leftDepth, rightDepth),因为假设是一个节点连着一个叶子节点,另一边是空,那么min(leftDepth, rightDepth)将返回0,这导致当前节点的计算深度实际上只为1,这是错误的,因为实际上有两个节点。
所以这个地方应该分别计算

class Solution {
public:int res = 0;int minDepth(TreeNode* root) {if(root == nullptr) return 0;int leftDepth = minDepth(root->left);int rightDepth = minDepth(root->right);if(root->left == nullptr || root->right == nullptr) res = max(leftDepth, rightDepth) + 1;if(root->left != nullptr && root->right != nullptr) res = min(leftDepth, rightDepth) + 1;return res;}
};

6.子树的最大平均值

会员题。
给你一棵二叉树的根节点root,找出这棵树的每一棵子树的平均值中的最大值。
在这里插入图片描述

  • 以value == 5的节点作为子树的根节点,得到的平均值为4
  • 以value == 6的节点作为子树的根节点,得到的平均值为6
  • 以value == 1的节点作为子树的根节点,得到的平均值为1

定义一个函数helper(node),返回一个arr[]数组,其中arr[0]表示以node为根节点的子树的所有元素和,arr[1]表示以node为根节点的子树的所有元素的个数
于是,平均数就是两个相除。

class Solution {
public:double maxMean = 0.0;double maximumAverageSubtree(TreeNode* root) {if (root == nullptr) return 0.0;helper(root);return maxMean;}private:pair<int, int> helper(TreeNode* root) {if (root == nullptr) return make_pair(0, 0);pair<int, int> left = helper(root->left);pair<int, int> right = helper(root->right);// Sum of values in the subtreeint sum = left.first + right.first + root->val;// Total number of nodes in the subtreeint count = left.second + right.second + 1;// Update the maximum average found so farmaxMean = max(maxMean, (double)sum / count);return make_pair(sum, count);}
};

7.求根节点到叶节点的数字之和

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:

例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。计算从根节点到叶节点生成的 所有数字之和 。

做法就是为了获取所有路径数字之和,递归遍历一遍二叉树,沿路记录下来路径上的数字,到叶子节点的时候求和。因为要求当前节点到叶子结点的序列,所以是前序遍历

class Solution {
public:int res = 0;int sumNumbers(TreeNode* root) {traverse(root, 0);return res;}void traverse(TreeNode* root, int sum){sum = sum * 10 + root->val;if(root->left == nullptr && root->right == nullptr){res += sum;return;}if(root->left)traverse(root->left, sum);if(root->right)traverse(root->right, sum);}
};

8.另一棵树的子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

class Solution {
public:bool isSubtree(TreeNode* root, TreeNode* subRoot) {if (root == nullptr) return false;  // 如果主树为空,不可能包含子树,返回falseif (subRoot == nullptr) return true; // 如果子树为空,空树被认为是任何树的子树,返回true// 检查当前节点的树与子树是否相同,或者子树是否存在于左子树或右子树中return sameTree(root, subRoot) || isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);}bool sameTree(TreeNode* root, TreeNode* subRoot) {if (root == nullptr || subRoot == nullptr) return root == subRoot; // 如果任一树为空,只有当两者都为空时返回true// 检查当前节点的值是否相同,并且递归检查左右子树return root->val == subRoot->val && sameTree(root->left, subRoot->left) && sameTree(root->right, subRoot->right);}
};

9.对称二叉树

给一个二叉树的根节点,检查它是否轴对称
在这里插入图片描述
判断两棵树是否镜像对称,只要判断两棵子树都是镜像对称的就行了。如果用迭代的方式,可以使用 BFS 层序遍历,把每一层的节点求出来,然后用左右双指针判断每一层是否是对称的。

class Solution {
public:bool isSymmetric(TreeNode* root) {if(root == nullptr) return true;return check(root->left, root->right);}bool check(TreeNode* left, TreeNode* right){if(left == nullptr || right == nullptr) return left == right;if(left->val != right->val) return false;return check(left->right, right->left) && check(left->left, right->right);}
};

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

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

相关文章

TypeScript 封装 Axios 1.7.7

随着Axios版本的不同&#xff0c;类型也在改变&#xff0c;以后怎么写类型&#xff1f; yarn add axios1. 封装Axios 将Axios封装成一个类&#xff0c;同时重新封装request方法 重新封装request有几个好处&#xff1a; 所有的请求将从我们定义的requet请求中发送&#xff…

setTimeout,setInterval ,requestAnimationFrame定时器

setTimeout&#xff0c;setInterval &#xff0c;requestAnimationFrame定时器 定时器函数通常用于执行定时任务&#xff0c;也就是说你做了一个功能放在定时器函数里&#xff0c;它可以在特定的时间去执行你的指令&#xff0c;或者说隔多长时间&#xff08;单位时间内—毫秒为…

Centos Stream 9备份与恢复、实体小主机安装PVE系统、PVE安装Centos Stream 9

最近折腾小主机&#xff0c;搭建项目环境&#xff0c;记录相关步骤 数据无价&#xff0c;丢失难复 1. Centos Stream 9备份与恢复 1.1 系统备份 root权限用户执行进入根目录&#xff1a; cd /第一种方式备份命令&#xff1a; tar cvpzf backup.tgz / --exclude/proc --exclu…

计算机系统基础概述

什么是计算机&#xff1f; 计算机是一种利用电子技术进行信息处理的设备&#xff0c;它能够接收、存储、处理和提供数据。计算机通过执行一系列预定义的指令来处理数据&#xff0c;这些指令通常被称为程序。计算机的核心功能包括算术运算、逻辑判断、数据存储和信息检索 计算…

STM32 通用定时器

一、概述 STM32内部集成了多个定时/计数器&#xff0c;根据型号不同&#xff0c;STM32系列芯片最多包含8个定时/计数器。其中&#xff0c;TIM6、TIM7为基本定时器&#xff0c;TIM2~TIM5为通用定时器&#xff0c;TIM1、TIM8为高级控制定时器。 1.定时器的类型 基本定时器通用定…

微信小程序-npm支持-如何使用npm包

文章目录 1、在内建终端中打开2、npm init -y3、Vant Weapp4、通过 npm 安装5、构建 npm 1、在内建终端中打开 Windows PowerShell 版权所有 (C) Microsoft Corporation。保留所有权利。尝试新的跨平台 PowerShell https://aka.ms/pscore6PS C:\Users\dgq\WeChatProjects\minip…

python泵站设备运行预警信息管理系统

目录 功能介绍具体实现截图技术栈和环境说明python语言解决的思路性能/安全/负载方面核心代码部分展示详细视频演示源码获取方式 功能介绍 用户端 注册登录&#xff1a;用户可以注册账号并登录系统。 西电泵站简介&#xff1a;提供泵站的历史、功能和重要性等详细介绍。 泵站…

余承东直播论道智能驾驶:激光雷达不可或缺,华为ADS 3.0引领安全创新

华为余承东:激光雷达,智能驾驶安全性的关键 9月29日,华为消费者业务集团CEO余承东在一场引人注目的直播中,与知名主持人马东就智能驾驶技术的最新进展进行了深入交流。在这场直播中,余承东针对激光雷达在智能驾驶中的必要性问题,发表了明确且深刻的观点,引发了业界和公众…

在Docker中运行微服务注册中心Eureka

1、Docker简介&#xff1a; 作为开发者&#xff0c;经常遇到一个头大的问题&#xff1a;“在我机器上能运行”。而将SpringCloud微服务运行在Docker容器中&#xff0c;避免了因环境差异带来的兼容性问题&#xff0c;能够有效的解决此类问题。 通过Docker&#xff0c;开发者可…

角色动画——RootMotion全解

1. Unity(2022)的应用 由Animtor组件控制 在Animation Clip下可进行详细设置 ​ 官方文档的介绍(Animation选项卡 - Unity 手册) 上述动画类型在Rag选项卡中设置: Rig 选项卡上的设置定义了 Unity 如何将变形体映射到导入模型中的网格&#xff0c;以便能够将其动画化。 对于人…

Linux驱动开发——LED驱动开发

文章目录 1 概述1.1 说明 2 基础知识2.1 地址映射2.1.1 ioremap函数2.1.2 iounmap函数 2.2 I/O内存访问函数2.2.1 读操作函数2.2.2 写操作函数 3 硬件原理图分析4 RK3568 GPIO驱动原理4.1 引脚复用设置4.2 引脚驱动能力配置4.3 GPIO输入输出设置4.4 GPIO引脚高低电平设置 5 实验…

【GeekBand】C++设计模式笔记5_Observer_观察者模式

1. “组件协作”模式 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”&#xff0c;“组件协作”模式通过晚期绑定&#xff0c;来实现框架与应用程序之间的松耦合&#xff0c;是二者之间协作时常用的模式。典型模式 Template MethodStrategyObserver / Event 2.…

HarmonyOS/OpenHarmony 自定义弹窗页面级层级控制解决方案

关键词&#xff1a;CuntomDialog自定义弹窗、SubWindow子窗口、页面级、弹窗层级控制、鸿蒙、弹窗展示层级异常 问题存在API版本&#xff1a;API10 - API12&#xff08;该问题已反馈&#xff0c;期望后续官方能增加页面级控制能力&#xff09; 在正常的鸿蒙app开发过程中&…

aws(学习笔记第二课) AWS SDK(node js)

aws(学习笔记第二课) 使用AWS SDK&#xff08;node js&#xff09; 学习内容&#xff1a; 使用AWS SDK&#xff08;node js&#xff09; 1. AWS SDK&#xff08;node js&#xff09; AWS支持多种SDK开发(除了AWS CLI&#xff0c;还支持其他的SDK) AndroidPythonNode.js(Javas…

约数个数约数之和

好久没发文章了.......不过粉丝还是一个没少...... 今天来看两道超级恶心的数论题目&#xff01; No.1 约数个数 No.2 约数之和 先来看第一道&#xff1a;约数个数 题目描述 给定 n 个正整数 ai​,请你输出这些数的乘积的约数个数,答案对 10^97 取模 输入格式 第一行包含…

五种IO模型与阻塞IO

一、前言 在网络中通信的本质其实是网络中的两台主机的进程间进行通信&#xff0c;而进程通信的本质就是IO。 IO分为输入&#xff08;input&#xff09;和输出&#xff08;output&#xff09;站在进程的角度讲&#xff0c;进程出去数据为输出&#xff0c;外部数据进入进程为输…

YOLOv8 基于NCNN的安卓部署

YOLOv8 NCNN安卓部署 前两节我们依次介绍了基于YOLOv8的剪枝和蒸馏 本节将上一节得到的蒸馏模型导出NCNN&#xff0c;并部署到安卓。 NCNN 导出 YOLOv8项目中提供了NCNN导出的接口&#xff0c;但是这个模型放到ncnn-android-yolov8项目中你会发现更换模型后app会闪退。原因…

[ComfyUI]Flux:太强了!任意扩图神器,小红书极致逼真风格出游打卡写实风

随着人工智能技术的不断发展&#xff0c;图像生成与反推技术已经成为了AI领域的一大热点。今天&#xff0c;我们就来为大家详细介绍一款由ComfyUI团队开发的超强图像反推工具——Flux&#xff0c;以及如何使用它实现任意扩图和极致逼真风格出游打卡写实风。 一、Flux&#xff…

【AI大模型】使用Embedding API

一、使用OpenAI API 目前GPT embedding mode有三种&#xff0c;性能如下所示&#xff1a; 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…

centos7安装配置nginx

先安装依赖 安装依赖之前最好先执行下update yum update yum install gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -y cd /usr/local/nginx wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -zxvf nginx-1.18.0.tar.gz cd /usr/local/ngi…