数据结构进阶 二叉树OJ题一

news2024/11/18 3:29:30

作者:@小萌新
专栏:@数据结构进阶
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:介绍几道二叉树的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/129925.html

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

相关文章

自动化信息治理:推动价值、安全性和合规性

现代组织充斥着数据&#xff0c;但信息的洪流可能变得势不可挡&#xff0c;危及利用其价值的能力。内容服务解决方案能够减轻洪水泛滥的风险&#xff0c;并帮助组织更好地控制信息。 从信息中获取价值的不同之处在于治理。建立正确的治理框架&#xff0c;组织可以最大限度地利…

难以挖掘的真相——塑料版薯条、意大利面、披萨……

下方图片中的“美食”&#xff0c;看起来是不是十分美味&#xff1f; ▲莱佛士平面设计学生作品 可千万要擦亮眼睛&#xff0c;它们其实是&#xff1a;黄色瓶盖“蛋黄”的荷包蛋&#xff0c;黄色吸管的“薯条”&#xff0c;桔黄色的塑料带子“意大利面”&#xff0c;红色塑料袋…

Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法

系列文章目录 Exynos4412的Linux时钟驱动开发&#xff08;一&#xff09;——Exynos4412的时钟管理单元CMU Exynos4412的Linux时钟驱动开发&#xff08;二&#xff09;——clock的初始化&#xff08;CLK_OF_DECLARE的机制&#xff09; Exynos4412的Linux时钟驱动开发&#x…

新蜂商城 -- 代码学习研读

新蜂商城 -- 代码学习研读1.Big Data -- Postgres1.1 Big Data -- Postgres2.Big Data -- Postgres3.AwakeningGit Website: https://github.com/newbee-ltd/newbee-mall. 新蜂商城线上预览地址: http://mall.newbee.ltd. &#x1f449;&#x1f449;学习的朋友给个小星星.感…

蓝牙标签操作流程

电脑网页端后台系统 下载蓝牙标签APP注册账号&#xff0c;登录电脑网页端即可制作模板 蓝牙标签管理系统 安卓手机系统 1. 使用手机浏览器扫码下载 2. 拷贝链接到手机浏览器下载 http://a.picksmart.cn:8088/picksmart/app/new-app-release-v3.0.31.apk 苹果手机系统&#…

公众号运营要做什么?公众号运营规划方案分享

你真的理解什么是公众号运营吗&#xff1f; 公众号运营遵循的是创作-分发-增长-变现的路径&#xff0c;从内容创作到内容分发到用户增长&#xff0c;到最终的转化变现&#xff0c;这才是完整的一个运营闭环&#xff0c;在这条路径中&#xff0c;缺少了哪一环都将影响整体运营效…

学习笔记之范海鹰微表情识别

微表情识别1. 微表情由来1.1 基本情绪和次级情绪1.2 保罗埃克罗的贡献2. 微表情意义2.1 微表情产生原理2.2 微表情的形态意义2.3 微表情的读心内涵2.4 微表情的应用价值3.微表情面部表情3.1 基线反应3.2 惊讶3.3 厌恶、轻蔑3.4 愤怒3.5 恐惧3.6 悲伤3.7 愉悦作为网上冲浪12级选…

redis实现session管理以及缓存穿透与雪崩

小伙正在评博客之星&#xff0c;欢迎大家来互相助力 我的链接 redis实现session管理以及缓存穿透与雪崩一、Redis实现分布式Session管理1 管理机制2 开发Session管理1. 引入依赖2. 开发Session管理配置类3.打包测试即可二、缓存穿透与雪崩缓存穿透缓存击穿&#xff08;量太大&a…

APSIM练习 2:残留物覆盖对休耕期间土壤储水的影响

跟踪覆盖度随着残留物分解而下降。 APSIM 模拟了作物残茬对休耕期间水分捕获和保留效率的影响。随着残留物分解&#xff0c;残留物覆盖率下降。在 APSIM 中模拟残留物分解以响应天气以及残留物的化学成分。通过进行此模拟&#xff0c;您将加强在先前练习中学到的技能&#xff0…

如何给藏品赋能?元宇宙电商NFG系统助力跨境电商新机遇

当前营销市场已陷入沉闷、难以创新的困境&#xff0c;大环境不容乐观&#xff0c;品牌方迫切需要新的创意与内容来吸引消费者。数字藏品是 Z世代和千禧一代在自我表达和社交方面的新兴媒介&#xff0c;在展示形式和互动方式上突破了传统营销方式的局限&#xff0c;帮助品牌在营…

github上传代码记录

文章目录新建仓库执行命令新建仓库 首先先创建一个仓库&#xff08;在主页面中点击New即可创建&#xff09; 填写仓库名称&#xff08;剩下的可以不用点击选择&#xff09; 创建完成之后&#xff0c;github上就会出现提交的提示代码。我们选择第一个进行代码的提交。 执行命…

数据结构中【迷宫问题】的两个OJ题

前言 今天是美好的一天&#xff0c;现在是体育课时间&#xff0c;我神奇的体育老师让我们男生需要做40个俯卧撑作为期末作业&#xff0c;可惜啊可惜&#xff0c;我差了一丝丝&#xff0c;这个东西对于我这种高瘦子还是有很大的挑战的&#xff0c;我现在能充分的感觉到码字的手…

Docker- 7.3、跨主机网络-flannel

flannel是CoreOS开发的容器网络解决方案。flannel为每个host分配一个subnet&#xff0c;容器从此subnet中分配IP&#xff0c;这些IP可以在host间路由&#xff0c;容器间无需NAT和port mapping就可以跨主机通信。每个subnet都是从一个更大的IP池中划分的&#xff0c;flannel会在…

【自学Java】Java语言HelloWorld

Java语言HelloWorld详解 Java语言HelloWorld详解教程 我们使用 java 编辑器&#xff0c;新建一个 Helloworld.java 文件,输入如下内容&#xff1a; package com.haicoder;public class HelloWorld {public static void main(String[] args) {System.out.println("嗨客网…

KubeSphere两种安装方式

目录 &#x1f9e1;KubeSphere简介 &#x1f9e1;KubeSphere安装 &#x1f9e1;前置环境 &#x1f9e1;基于K8S &#x1f9e1;KubeKey一键安装 &#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习变得有趣&#xff01; &#x1f49f;没有对象不要怕&#xff0c;我们…

CSS——过渡与动画

1. 缓动效果 给过渡和动画加上缓动效果&#xff08;比如具有回弹效果的过渡过程&#xff09; 回弹效果是指当一个过渡达到最终值时&#xff0c;往回倒一点&#xff0c;然后再次回到最终值&#xff0c;如此往复一次或多次&#xff0c;并逐渐收敛&#xff0c;最终稳定在最终值。…

报表开发工具FastReport.NET的十大常见问题及解决方法

Fastreport是目前世界上主流的图表控件&#xff0c;具有超高性价比&#xff0c;以更具成本优势的价格&#xff0c;便能提供功能齐全的报表解决方案&#xff0c;连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 FastReport.NET官方版下载&#xff08;qun&#x…

Redis基础篇——SQL和NoSQL区别

文章目录认识 NoSQLSQL 和 NoSQL 的区别认识 NoSQL NoSQL&#xff0c;泛指非关系型的数据库。随着互联网web2.0网站的兴起&#xff0c;传统的关系数据库在处理web2.0网站&#xff0c;特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心&#xff0c;出现了很多…

熵及其相关概念

文章目录一、什么是熵&#xff1f;二、相对熵&#xff08;KL散度&#xff09;三、交叉熵四、条件熵&#xff0c;联合熵&#xff0c;互信息一、什么是熵&#xff1f; 熵&#xff0c;entropy&#xff0c;一个简简单单的字却撑起了机器学习的半壁江山&#xff0c;熵起源于热力学&a…

怎么做3D可视化?NebulaGraph Explorer 的图数据库可视化实践告诉你答案

前言 图数据可视化是现代 Web 可视化技术中比较常见的一种展示方式&#xff0c;NebulaGraph Explorer 作为基于 NebulaGraph 的可视化产品&#xff0c;在可视化图数据领域积累了许多经验&#xff0c;尤其是在图形渲染性能等领域。本文将系统性分享下 NebulaGraph Explorer 在 …