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

news2024/11/28 20:43:22

用于个人复习

  • 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 long

        Pair(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 subtree
        int sum = left.first + right.first + root->val;
        // Total number of nodes in the subtree
        int count = left.second + right.second + 1;

        // Update the maximum average found so far
        maxMean = 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;  // 如果主树为空,不可能包含子树,返回false
        if (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.coloradmin.cn/o/2192192.html

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

相关文章

麒麟操作系统如何识别提取图片中的文字

在工作、学习中&#xff0c;我们经常会需要从图片中提取文字&#xff0c;在手机上或其它操作系统上&#xff0c;有各种方法。本书中&#xff0c;我们介绍麒麟操作系统提取图片中文字的方法。 首先准备好自己需要的文档截图&#xff0c;把不需要的部分裁掉&#xff0c;以免影响…

电容笔值得买吗?2024精选盘点推荐五大惊艳平替电容笔!

电容笔还是很值得买的&#xff0c;不管是对于日常书写&#xff0c;简单笔记&#xff0c;还是绘画等场景而言&#xff0c;选择一款性价比高的平替电容笔都能提升生产力。可是现在市面上的品牌很多&#xff0c;该如何挑选最适合自己的电容笔呢&#xff1f;不用着急&#xff0c;我…

【AIGC半月报】AIGC大模型启元:2024.10(上)

【AIGC半月报】AIGC大模型启元&#xff1a;2024.10&#xff08;上&#xff09; (1) YOLO11&#xff08;Ultralytics新作&#xff09; (1) YOLO11&#xff08;Ultralytics新作&#xff09; 2024.10.01 Ultralytics在 YOLO Vision 2024 活动上宣布发布其新的计算机视觉模型 YOLO…

千元级体验--希亦ACE迷你洗衣机测评分享,宝妈必备的性价比好物

​小孩子的衣物是不建议和大人衣物一起洗的&#xff0c;一方面是他们的免疫力比较低下&#xff0c;如果和大人混杂各种污渍病菌一起洗的话&#xff0c;容易有感染细菌的可能。而另一方面&#xff0c;小孩子特别是女婴的衣物&#xff0c;更要仔细注意&#xff0c;因为大人的衣物…

ad.concat()学习

学习1 import anndata as ad, pandas as pd, numpy as np from scipy import sparse a ad.AnnData(Xsparse.csr_matrix(np.array([[0, 1], [2, 3]])),obspd.DataFrame({"group": ["a", "b"]}, index["s1", "s2"]),varpd.D…

(作业)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第3关---浦语提示词工程实践

基础任务 (完成此任务即完成闯关) 背景问题&#xff1a;近期相关研究发现&#xff0c;LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题&#xff0c;例如认为13.8<13.11。 任务要求&#xff1a;利用Lang…

[C++]使用纯opencv部署yolov11旋转框目标检测

【官方框架地址】 GitHub - ultralytics/ultralytics: Ultralytics YOLO11 &#x1f680; 【算法介绍】 YOLOv11是一种先进的对象检测算法&#xff0c;它通过单个神经网络实现了快速的物体检测。其中&#xff0c;旋转框检测是YOLOv11的一项重要特性&#xff0c;它可以有效地检…

vulnhub-digitalworld.local DEVELOPMENT靶机

vulnhub&#xff1a;digitalworld.local: DEVELOPMENT ~ VulnHub 导入靶机&#xff0c;放在kali同网段&#xff0c;扫描 靶机在192.168.114.129&#xff0c;扫描端口 开了几个端口&#xff0c;8080端口有网页&#xff0c;访问 说是让访问html_pages 似乎把页面都写出来了&…

FPGA时序分析和约束学习笔记(2、FPGA时序传输模型)

Tclk1TcoTdata < Tclk Tclk2 -Tsu Slack Tskew Tclk - Tsu - Tdata - Tco Skew时钟偏斜&#xff1a;时钟从源端口出发&#xff0c;到达目的寄存器和源寄存器的时间差值&#xff08;Tclk2-Tclk1&#xff09; Tsu建立时间&#xff1a;目的寄存器自身的特性决定&#xff…

掌握RocketMQ4.X消息中间件(一)-RocketMQ基本概念与系统架构

1 MQ介绍 MQ(Message Quene) : 翻译为 消息队列,别名为 消息中间件&#xff0c;通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息&#xff0c;消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的&#xff0c;而且只关心消息的发送和接收&#xff0c…

动态桌面时钟 让时间在桌面舞动 发现生活中的美好瞬间!

在快节奏的现代生活中&#xff0c;时间是最宝贵的资源之一。无论是在工作还是生活中&#xff0c;我们都需要时刻关注时间&#xff0c;在桌面显示一个时钟&#xff0c;可以让你更方便的掌握时间。今天小编给大家推荐一个软件《芝麻时钟》&#xff08;下载地址&#xff1a;https:…

vulnhub-DC 2靶机

vulnhub&#xff1a;DC: 2 ~ VulnHub 导入靶机&#xff0c;放在kali同网段&#xff0c;扫描 靶机在192.168.81.12&#xff0c;扫描端口 存在网站服务&#xff0c;访问&#xff0c;发现访问不到&#xff0c;做一下详细扫描 似乎是提示我们要用域名dc-2&#xff0c;编辑hosts文件…

(附源码)NodeJS社区独居老人健康管理系统-计算机毕设 21353

NodeJS社区独居老人健康管理系统 摘 要 随着科技的进步&#xff0c;信息技术已经深刻地影响了社会的各个领域。计算机的普及已经成为了不可或缺的一部分&#xff0c;它为我们提供了无限的可能性。 该社区独居老人健康管理系统提供了多种功能&#xff0c;包括查看首页、个人中…

【路径规划】移动机器人在未知环境下目标的路径规划算法

摘要 本文提出了一种新的路径规划算法&#xff0c;适用于在未知环境下的移动机器人。算法旨在帮助机器人从起点移动到目标点&#xff0c;同时避开环境中的障碍物。该算法基于势场方法&#xff0c;但解决了传统算法中常见的局部极小值问题&#xff0c;从而提高了路径规划的成功…

在线教育新篇章:SpringBoot系统开发策略

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

实例分割、语义分割和 SAM(Segment Anything Model)

实例分割、语义分割和 SAM&#xff08;Segment Anything Model&#xff09; 都是图像处理中的重要技术&#xff0c;它们的目标是通过分割图像中的不同对象或区域来帮助识别和分析图像&#xff0c;但它们的工作方式和适用场景各有不同。 1. 语义分割&#xff08;Semantic Segme…

红黑树学习

红黑树: k v 方式 用在哪里&#xff1a; 1.hash 强查找的过程&#xff1a; 1.rbtree 2.hash 3.b/b tree 4.链表 红黑树&#xff1a; 1.每个结点是红的或者是黑的 2.根结点是黑的 3.每个叶子结点是黑的 4.如果一个结点是红的&#xff0c;则它的两个儿子是黑的 5.对每个节点&…

lrzsz串口文件传输

此时如果需要传输文件&#xff0c;需要借助rz/sz工具&#xff0c;可以使用的传输协议有ZMODEM、YMODEM、XMODEM&#xff0c;默认是ZMODEM。 https://en.wikipedia.org/wiki/ZMODEM https://gallium.inria.fr/~doligez/zmodem/zmodem.txt 这里记录item2下使用rz/sz进行文件传输…

AI驱动的数据智能化:如何提升企业数据处理效率?

在当今数据驱动的时代&#xff0c;企业需要高效、精准的方式来管理和查询日益增长的业务数据。AI技术在这个过程中发挥着至关重要的作用&#xff0c;它通过自动化、智能化的方式处理数据、构建知识模型、实现查询优化&#xff0c;并将复杂的数据结构直观地呈现出来。本文将通过…

Spring Boot 进阶-详解Spring Boot整合数据库

在Java企业级开发中,不可避免的要对数据进行持久化,我们常见的数据持久化的技术又Mybatis技术、Spring自带的JdbcTemplate以及SpringBoot中的JPA技术。但是无论怎么样的持久化技术,其底层都是离不开数据库的支持。 在刚开始学习Java操作数据库的时候,最长用到的技术就是JDB…