数据结构进阶 二叉树OJ题

news2024/11/18 10:24:21

作者:@小萌新
专栏:@数据结构进阶
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:介绍几道二叉树的oj题

二叉树OJ题

    • 题目一 根据二叉树创建字符串
    • 题目二 二叉树的层序遍历
    • 题目三 二叉树的最近公共祖先

题目一 根据二叉树创建字符串

给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-string-from-binary-tree

在这里插入图片描述

我们先忽略掉题目中要求我们省略括号这个步骤

这个题目其实就是要求我们按照前序遍历的方式遍历整个二叉树 并且将其中的节点变为字符加入到字符串当中去

并且遍历到左右节点之前要加括号 遍历完毕之后要闭合括号

    string ans = "";
    string tree2str(TreeNode* root) 
    {
        if (root == nullptr)
        {
            return ans;
        }

        ans += to_string(root->val);
        // 遍历左子树
        ans += '(' ;
        tree2str(root -> left);
        ans += ')' ;

        // 遍历右子树
        ans += '(' ;
        tree2str(root -> right);
        ans += ')' ;
        

        return ans;
    }

于是我们写出上面的代码 得到的结果如下

在这里插入图片描述
这里我们可以发现相比于预期的结果 多了很多不必要的括号

首先就是左右子树为空的情况 针对这种情况我们做出这样子的代码优化

        if (root -> left)
        {
        ans += '(' ;
        tree2str(root -> left);
        ans += ')' ;
        }

        // 遍历右子树
        if (root -> right)
        {
        ans += '(' ;
        tree2str(root -> right);
        ans += ')' ;
        }

我们可以发现 经过这样子的优化之后就消除了很多空格

在这里插入图片描述
但是还有一种情况没有顾及到

在这里插入图片描述
那就是示例2的情况 此种情况中 左子树为空且右子树不为空 也加上了一个空括号 于是乎我们的条件应该变成这样

root -> left || root -> right

这个条件用的很巧妙

因为当树的左孩子为空的时候才会判断第二个条件 这个时候才能符合左子树为空 并且右子树不为空

完整代码如下

    string ans = "";
    string tree2str(TreeNode* root) 
    {
        if (root == nullptr)
        {
            return ans;
        }

        ans += to_string(root->val);
        // 遍历左子树

        if (root -> left || root -> right)
        {
        ans += '(' ;
        tree2str(root -> left);
        ans += ')' ;
        }

        // 遍历右子树
        if (root -> right)
        {
        ans += '(' ;
        tree2str(root -> right);
        ans += ')' ;
        }

        return ans;
    }

运行结果如下

在这里插入图片描述

题目二 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

在这里插入图片描述

层序遍历的题目我们之前已经做过了 思路也很简单 使用一个队列即可完成

在这道题目还有一个需要我们解决的问题就是如何确定层序遍历的每一层的个数

并且将它们放到vector当中 这里提供一个使用变量levelsize来记录每一层大小的操作

在这里插入图片描述
我们每层遍历完(levelsize为0)的时候确认一次队列的大小

并将其值赋值给levelsize

之后每次出一个数据 levelsizie的大小减一 依此循环

代码表示如下

class Solution {
public:
    vector<vector<int>> vv;
    queue<TreeNode*> q;
    vector<int> v1;
    vector<vector<int>> levelOrder(TreeNode* root) 
    {
        // 如果空树 直接返回一个空的vector
        if (root == nullptr)
        {
            return vv;
        }


        int levelsize = 1;
        q.push(root);


        while (!q.empty())
        {
            
            if (levelsize != 0)
            {
                TreeNode* front = q.front();
                q.pop();
                v1.push_back(front->val);
                levelsize--;
                if (front->left != nullptr)
                {
                    q.push(front->left);
                }
                if (front->right != nullptr )
                {
                    q.push(front->right);
                }

            }
            else
            {
                vv.push_back(v1);
                v1.clear();
                levelsize = q.size();
            }
        }


        // 为什么这里要再push一次 因为最后一次队列为空的时候没有进循环
        vv.push_back(v1);
        
        return vv;
    }
};

题目三 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree

在这里插入图片描述
我们首先来分析题目

很明显的可以发现 要满足二叉树的公共祖先则必然满足两个节点分布在根节点的两边

那么知道这个限制条件就简单很多了

首先我们先写出一个搜寻函数

    bool find(TreeNode* root , TreeNode* x)
    {
        if (root == NULL)
        {
            return false;
        }

        if (root == x)
        {
            return true;
        }

        return find(root -> left , x) || find(root -> right , x);
    }

在这之后我们设计四个布尔值来确定根节点的位置

bool pleft , pright , qleft , qright;

之后的思路就很简单了

我们只要保证p和q不在同一边

也就是说 pleft与qright相同 或者qleft和pright相同就可以

代码表示如下

class Solution {
public:

    bool find(TreeNode* root , TreeNode* x)
    {
        if (root == NULL)
        {
            return false;
        }

        if (root == x)
        {
            return true;
        }

        return find(root -> left , x) || find(root -> right , x);
    }


    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) 
    {

        if (root == NULL)
        {
            return NULL;
        }

        if (root == p || root == q)
        {
            return root;
        }
        // 再之后我们使用搜寻函数来确定两个节点的左右
        bool pleft , pright , qleft , qright;

        pleft = find(root -> left, p);
        pright = !pleft;

        qleft = find(root -> left , q);
        qright = !qleft;


        if ((pleft && qright) || (pright && qleft))
        {
            return root;
        }
        else if(pleft && qleft)
        {
            return lowestCommonAncestor(root->left ,p,q);
        }
        else if (pright && qright)
        {
            return lowestCommonAncestor(root ->right , p, q);
        }
        else
        {
            return root;
        }
        
    }
};

运行结果如下

在这里插入图片描述

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

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

相关文章

华为机试 HJ35 蛇形矩阵

华为机试 HJ35 蛇形矩阵[HJ35 蛇形矩阵](https://www.nowcoder.com/practice/649b210ef44446e3b1cd1be6fa4cab5e)方法一&#xff1a;顺序填表方法2&#xff1a;数学规律HJ35 蛇形矩阵 描述 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。 例如&#xff0c;当输入5…

【数据结构】链表基础知识讲解

文章目录链表链表的结构使用链表的优点模拟实现链表链表 在之前的学习中我们讲解了顺序表ArrayList&#xff0c;Java模拟实现顺序表&#xff0c;如果需要大家可以去看一看&#xff0c;顺序表底层的实现逻辑其实就是数组&#xff0c;在物理存储结构和逻辑上都是连续的&#xff…

Eth 03 -以太网驱动Eth的配置

以太网的配置,下面这张图描述了以太网的配置参数: EthCtrlConfig:单个控制器的配置EthCtrlEnableMii :启用/禁用用于收发器访问的媒体独立接口 (MII)EthCtrlEnableRxInterrupt:启用/禁用接收中断EthCtrlEnableTxInterrupt:启用/禁用传输中断EthCtrlIdx:指定已配置控制…

【BUUCTF】MISC(第一页wp)

文章目录签到金三胖二维码你竟然赶我走大白N种方法解决乌镇峰会种图基础破解wireshark文件中的秘密图片exifLSBLSB隐写&#xff08;最低有效位隐写&#xff09;&#xff1a;zip伪加密ZIP 文件由**三个部分**组成&#xff1a;**压缩源文件数据区**&#xff1a;**压缩源文件目录区…

FS4412环境搭建

目录 一、开发板硬件资源介绍 二、交叉开发环境 2.1安装交叉编译工具链 2.2配置全局变量​编辑 2.3测试​编辑 2.4终端 2.5安装串口驱动 2.6上电测试 三、地址映射表 一、开发板硬件资源介绍 中间红色的是samsung的主控&#xff0c;四个粉色的256M的内存条&#xff0…

STM32F4SysTick记录

滴哒主要用于延时和实时系统 模板为原子串口实验源码&#xff0c;入口为24行 120行为滴哒定时器的CTRL寄存器位时钟源设置 这个参数的必要性是用于溢出时间的计算参数之一 可以设置为HCLK或HCLK的8分频 延时函数理解 设置LOAD是设置重装载值 设置VAL清空计数值以及标志位 …

强大的ANTLR4(2)

每次在命令行里输入文本有点麻烦&#xff0c;可以将hello slb保存于hello.txt文本文件中&#xff0c;然后运行命令&#xff1a; antlr4-parse Hello.g4 r -tokens hello.txt出现如下内容&#xff1a; [0,0:4hello,<hello>,1:0] [1,6:8slb,<ID>,1:6] [2,9:8<EO…

JDBC开荒

docker 创建MySQL 一、简介 Java DataBase Connectivity &#xff0c;是Java程序访问数据库的标准接口 Java访问DB的时候&#xff0c;并不是直接通过TCP连接的&#xff0c;而是通过JDBC接口&#xff0c;而JDBC接口又是通过JDBC驱动来访问的 JDBC是Java标准库自带的&#xff0…

(HP)next.js入门

推荐文档&#xff1a;生成<head> - 《next.js v7.0 中文文档》 - 书栈网 BookStack 1&#xff0c;解决的问题 SPA单页面应用的两个问题&#xff1a;首屏加载过慢&#xff0c;不能SEO(搜索引擎抓取&#xff09; 2&#xff0c;它是一个react服务端渲染框架 3&#xff0c;…

ArcGIS去除黑边方法汇总

概述 在使用ArcGIS对影像进行应用的时候&#xff0c;如果出现了黑边&#xff0c;除了影响美观之外&#xff0c;进行镶嵌处理也可能会有问题&#xff0c;这里&#xff0c;我们介绍一下几种ArcGIS去除黑边的方法&#xff0c;希望能够对大家有所帮助。 数据来源 教程所使用的实…

【C++进阶】类型转换

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

蓝桥杯Python练习题8-查找整数

资源限制   内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给出一个包含n个整数的数列&#xff0c;问整数a在数列中的第一次出现是第几个。 输入格式   第一行包含一个整数n。  …

欢迎谷歌回归中国,但有前提!李彦宏也发了条朋友圈

2018年&#xff0c;Google部分功能成功回归中国大陆 周一&#xff0c;人民日报在海外社交媒体平台Twitter和Facebook上刊文&#xff0c;针对谷歌计划以过滤版搜索引擎重返中国大陆的消息回应称&#xff0c;欢迎谷歌重返中国大陆&#xff0c;但前提是必须遵守中国法律。李彦宏在…

云计算IaaS、PaaS(iPaaS/aPaaS)以及SaaS以及发展趋势

一、云计算IaaS、PaaS以及SaaS架构 云计算涉及了很多产品与技术&#xff0c;表面上看起来的确有点纷繁复杂&#xff0c;但是云计算本身还是有迹可循和有理可依的&#xff0c;下面介绍一套云计算的架构&#xff0c;具体请看图&#xff1a; 上面这个云架构共分为服务和管理这两…

车载入侵检测与防御系统介绍

作者 | 田铮 上海控安可信软件创新研究院项目经理 来源 | 鉴源实验室 引言&#xff1a;上一篇文章&#xff08;智能网联汽车网络安全攻击与防御技术概述&#xff09;介绍了智能网联汽车中的网络安全攻击案例和具体攻击类型。而本篇文章中&#xff0c;我们将对汽车网络安全风险…

SpringSecurity——OAuth2框架鉴权实现源码分析

SpringSecurity——OAuth2框架鉴权实现源码分析一、ManagedFilter迭代过滤器链1.4 springSecurityFilterChain1.4.7 OAuth2AuthenticationProcessingFilter①.OAuth2AuthenticationProcessingFilter.class②.CookieTokenExtractor.class&#xff08;我们自己重写的方法&#xf…

瞄准智慧园区 东方恩拓与用友协同开拓新商机

在数字化转型升级浪潮中&#xff0c;传统园区也在寻求新的发展方向&#xff0c;从传统园区向智慧园区甚至未来园区不断演进。随着国家“数字中国”、“中国智造”、“新基建”等战略的部署&#xff0c;智慧园区也迎来了新的发展机遇&#xff0c;园区的数字化、网络化、智能化是…

户外运动耳机选择哪个、最适合户外运动的蓝牙耳机推荐

还有哪个季节比秋天更适合爬山和徒步等户外运动的吗&#xff1f;秋天—没有夏日的骄阳&#xff0c;没有冬天的万物凋零&#xff0c;放眼望去都是墨绿和金黄&#xff0c;上山的话还可以采摘成熟的各种各样的果子…但是一个人的话难免有些落寞&#xff0c;要是有音乐的陪伴则会增…

公网远程连接windows SQL Server数据库【内网穿透】

文章目录1. 本地安装配置SQL Server2. 将本地sqlserver服务暴露至公网2.1 本地安装cpolar内网穿透2.2 创建隧道3. 公网远程连接sqlserver3.1 使用命令行远程连接sqlserver3.2 使用navicat premium图形界面远程连接sqlserver3.3 使用SSMS图形界面远程连接sqlserver疫情当下,居家…

win7电脑怎么录屏?超级简单的2种电脑录屏方法

相信还有不少朋友的电脑系统是win7系统。其实&#xff0c;win7电脑和win10电脑一样都有自带录屏功能。那win7电脑怎么录屏&#xff1f;在win7电脑上开启运行窗口即可&#xff0c;当然也可以通过使用专业的录屏软件来录制屏幕。 下面就由小编给大家介绍一下2个win7电脑录屏的方…