代码随想录65——额外题目【二叉树】:129求根节点到叶节点数字之和、1382将二叉搜索树变平衡、100相同的树、116填充每个节点的下一个右侧节点指针

news2025/7/11 9:46:16

文章目录

  • 1.129求根节点到叶节点数字之和
    • 1.1.题目
    • 1.2.解答
  • 2.1382将二叉搜索树变平衡
    • 2.1.题目
    • 2.2.解答
  • 3.100相同的树
    • 3.1.题目
    • 3.2.解答
  • 4.116填充每个节点的下一个右侧节点指针
    • 4.1.题目
    • 4.2.解答
      • 4.2.1.递归解法
      • 4.2.2.迭代方法

1.129求根节点到叶节点数字之和

参考:代码随想录,129求根节点到叶节点数字之和;力扣题目链接

1.1.题目

在这里插入图片描述

1.2.解答

这道题和之前做的题目:代码随想录18——二叉树:513找树左下角的值、112路径总和+113路径总和II、106从中序和后序遍历序列构造二叉树+105从前序和中序遍历序列构造二叉树 是一样的,就是遍历一条路径,到了叶子节点之后就收集结果,然后进行回溯再遍历其他路径。

很简单,直接给出代码,具体思路去看上面的博客即可。

int result;  // 最终累加的结果
vector<int> path;   // 收集中间路径的值

// 把path中的数字转成int
int vectorToInt(const vector<int>& path)
{
    int sum = 0;
    for(const auto& num : path)
        sum = 10 * sum + num;
    return sum;
}

void traversal(TreeNode* root)
{
    // 2.递归终止条件:到达叶子节点,则开始收集结果
    if(root->left == nullptr && root->right == nullptr)
    {
        result += vectorToInt(path);  // 收集结果
        return;   // 直接返回
    }

    // 3.开始递归
    if(root->left)
    {
        path.push_back(root->left->val);  // 递归之前先把当前的节点的数字加到数组中
        traversal(root->left);   // 递归
        path.pop_back();  // 回溯
    }

    if(root->right)
    {
        path.push_back(root->right->val);
        traversal(root->right);
        path.pop_back();  // 回溯
    }
}

int sumNumbers(TreeNode *root)
{
    if(root == nullptr)
        return 0;
    path.push_back(root->val);  // 先把根节点存到路径中
    traversal(root);  // 然后调用递归
    return result;  // 最后返回结果
}

2.1382将二叉搜索树变平衡

参考:代码随想录,1382将二叉搜索树变平衡;力扣题目链接

2.1.题目

在这里插入图片描述

2.2.解答

这道题目也很简单,就实现先使用中序遍历收集原来的二叉搜索树的节点值,然后重新构造一个平衡的二叉搜索树。之前也做过类似的题目,很简单。

直接给出代码如下:

vector<int> vec;   // 收集原来的二叉树上的节点的结果

// 左中右顺序收集二叉搜索树的所有数字,得到升序的数组
void traversal(TreeNode* root)
{
    if(root == nullptr)
        return;
    traversal(root->left);
    vec.push_back(root->val);
    traversal(root->right);
}

// 传入升序数组和左右边界(左闭右闭),构造平衡二叉搜索树
TreeNode* buildTree(const vector<int>& nums, int left, int right)
{
    if(left > right)
        return nullptr;
    
    int middle = left + (right - left) / 2;
    TreeNode* cur = new TreeNode(nums[middle]);
    cur->left = buildTree(nums, left, middle-1);
    cur->right = buildTree(nums, middle+1, right);

    return cur;
}

TreeNode *balanceBST(TreeNode *root)
{
    traversal(root);   // 先收集结果
    return buildTree(vec, 0, vec.size()-1);  // 然后构造二叉搜索树
}

3.100相同的树

参考:代码随想录,100相同的树;力扣题目链接

3.1.题目

在这里插入图片描述

3.2.解答

这道题目也很简单,和之前做过的一道题目 判断一个二叉树是不是对称二叉树 是一样的。

直接给出代码如下,很简单:

bool isSameTree(TreeNode *p, TreeNode *q)
{
    // 左右都是空,则相同
    if(p == nullptr && q == nullptr)
        return true;
    else if(p == nullptr && q != nullptr)
        return false;
    else if(p != nullptr && q == nullptr)
        return false;
    else  // 左右都不是空,然后就要比较数值,数值不同则直接false
        if(p->val != q->val)
            return false;

    // 运行到这里,则当前节点不为空,并且数值相同,则需要往下递归
    bool left = isSameTree(p->left, q->left);
    bool right = isSameTree(p->right, q->right);
    return left && right;  // 返回当前节点的结果
}

4.116填充每个节点的下一个右侧节点指针

参考:代码随想录,116填充每个节点的下一个右侧节点指针;力扣题目链接

4.1.题目

在这里插入图片描述
在这里插入图片描述

4.2.解答

注意题目提示内容,:

  • 你只能使用常量级额外空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

基本上就是要求使用递归了,因为迭代的方式一定会用到栈或者队列,一定会使用到额外的空间。

4.2.1.递归解法

一想用递归怎么做呢,虽然层序遍历是最直观的,但是递归的方式确实不好想。

如图,假如当前操作的节点是cur:

在这里插入图片描述
最关键的点是可以通过上一层递归 搭出来的线进行本次搭线

图中cur节点为元素4,那么搭线的逻辑代码:(注意注释中操作1和操作2和图中的对应关系)

if (cur->left) cur->left->next = cur->right; // 操作1
if (cur->right) {
    if (cur->next) cur->right->next = cur->next->left; // 操作2
    else cur->right->next = NULL;
}

最后给出如下完整代码:

void traversal(Node* root)
{
    if(root == nullptr)
        return;
    // 中
    if(root->left)   
        root->left->next = root->right;  // 注意完美二叉树,所以左不为空的话,右一定也不为空
    if(root->right)  
    {
        if(root->next)  // 上一层有连接线的话,就可以给本层的连接线提供桥梁
            root->right->next = root->next->left;
        else
            root->right->next = nullptr;
    }

    // 左右
    traversal(root->left);
    traversal(root->right);
}

Node *connect(Node *root)
{
    traversal(root);
    return root;
}

4.2.2.迭代方法

本题使用层序遍历是最为直观的,遍历每一行的时候,如果不是最后一个Node,则指向下一个Node;如果是最后一个Node,则指向nullptr。

代码如下:

Node *connect(Node *root)
{
    queue<Node *> que;
    if (root == nullptr)
        return root;
    que.push(root);

    while (!que.empty())
    {
        int size = que.size(); // 当前要遍历的这一层的节点个数
        // 遍历这一层的所有节点
        for (int i = 0; i < size; i++)
        {
            Node *cur = que.front();
            que.pop();
            if(i < size - 1)
                cur->next = que.front();
            else
                cur->next = nullptr;
            // 把这个节点的子节点(即下一层)加到队列中,为下一次遍历做准备
            if (cur->left != nullptr)
                que.push(cur->left);
            if (cur->right != nullptr)
                que.push(cur->right);
        }
    }

    return root;
}

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

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

相关文章

品优购项目详细分析

能够独立完成品优购首页制作哦 能够独立完成品优购列表页制作 能够独立完成品优购注册页制作 能够把品优购网站部署上线 网站制作流程&#xff1a; 初稿审核&#xff1a;网页美工会制作原型图和psd效果图 品优购项目规划&#xff1a; 1 品优购项目整体介绍 描述&#xff1…

【TS】函数重载--可选参数--默认参数

可选参数–默认参数 在ts中定义的数据类型&#xff0c;某些情况下只需要传入定义数据类型的一部分参数&#xff0c;比如&#xff1a;id 、name、age、address&#xff0c;此时需要修改用户的名称&#xff0c;那么只需要传入id、name就够了&#xff1b;某些情况下需要修改用户的…

.net-----集合和数据结构

集合和数据结构前言集合和数据结构的基本概念命名空间列表类集合列表类集合&#xff1a;数组列表列表类集合&#xff1a;列表List<T>双向链表LinkedList<T>字典类集合字典类集合类型哈希表Hashtable字典类集合&#xff1a;Dictionary<TKey, TValue >排序列表…

Vue3 Pinia 全局状态管理工具的使用

Pinia 是 Vue3 官方更推荐使用的全局状态管理工具。 Pinia 最初正是为了探索 Vuex 的下一个版本而开发的&#xff0c;因此整合了核心团队关于 Vuex 5 的许多想法。最终&#xff0c;我们意识到 Pinia 已经实现了我们想要在 Vuex 5 中提供的大部分内容&#xff0c;因此决定将其作…

E-梅莉的市场经济学

E-梅莉的市场经济学 题目背景 梅莉这个学期选修了经济学。但是主修心理学的她实在不擅长经济领域的分析&#xff0c;为此她时常抱怨自己学不会&#xff0c;想退课。 但是如果现在退掉的话这学期的学分就不够啦&#xff0c;因此她根据“梦中”的经历&#xff0c;“胡诌”了一…

Unity 如何实现框选游戏战斗单位

文章目录&#x1f354; Preface✨ 如何在屏幕坐标系内绘制框选框&#x1f389; 根据框选范围定位其在世界坐标系中对应的区域&#x1f947; 在该区域内进行物理检测&#x1f354; Preface 本文简单介绍如何实现即时战略游戏中框选战斗单位的功能&#xff0c;如图所示&#xff…

NeRF-SLAM 学习笔记

NeRF-SLAM: Real-Time Dense Monocular SLAM with Neural Radiance Fields 主页&#xff1a;https://deepai.org/publication/nerf-slam-real-time-dense-monocular-slam-with-neural-radiance-fields 论文&#xff1a;https://arxiv.org/pdf/2210.13641.pdf Code&#xff1a;…

RabbitMQ复习笔记

文章目录RabbitMQ一、MQ引言1.1、什么是MQ1.2、MQ有哪些1.3、不同MQ特点二、RabbitMQ 的引言2.1、RabbitMQ2.2、RabbitMQ的安装2.2.1、下载2.2.2、下载的安装包2.2.3、安装步骤三、RabiitMQ 配置3.1、RabbitMQ 管理命令行3.2、web管理界面介绍3.2.1、overview概览3.2.2 Admin用…

手摸手利在idea中利用maven创建web项目

1. 下载maven&#xff0c;目前最新版本是3.8.6。在环境变量中创建MAVEN_HOME变量&#xff0c;并在PATH中添加。maven的运行依赖于java环境&#xff0c;这意味着在配置MAVEN前&#xff0c;应该已经在环境变量中配置有JAVA_HOME和PATH中配置好了JAVA相关环境。 2. 配置完毕后&…

力扣(LeetCode)84. 柱状图中最大的矩形 (C++)

朴素思想 朴素思想&#xff0c;找左右边界&#xff0c;依次乘以区间内最小上边界&#xff0c;取最大值。这个做法需要遍历左边界&#xff0c;对于每个左边界遍历右边界。因此需要 O(n2)O(n^2)O(n2) 的时间复杂度。 转换思路&#xff0c;确定上边界&#xff0c;找左右边界。这…

数据结构--循环链表

目录 1.为什么要有循环链表 2.定义 3.循环链表和单链表的图示对比 4.循环链表和单链表的代码对比 5.循环链表的操作 1.clist.h 2.clist.cpp 1.初始化plist 2.往plist中头部插入数字val 3.往plist中的尾部插入数字val 4.在plist中查找val值,找到返回该节点地址,失败返…

SpringAOP(2)-spring源码详解(七)

上篇文章说了spring的aop&#xff0c;在启动类加一个启动注解&#xff0c;注解点进源码可以看到注册了bean定义的后置处理器。每个切入点都会生成一个adviosr&#xff0c;他们会排序好依次注册。 他的顺序是before、after、afterRturning、afterThrowing 原创 SpringAOP&…

Mac解决鼠标滚轮反方向移动逻辑--Mos(又免费又好用哦~)

目录&#xff1a;&#x1f335;&#x1f335;&#x1f335;前言什么&#xff1f;Mac竟然需要鼠标&#xff1f;Mos &#xff0c;让你的鼠标丝般顺滑&#xff5e;❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭&#xff01;&#x1f335;&#x1f335;&#x1f335;前言 ✨你好啊&…

PHP连接外部服务器的MySQL参考教程

PHP连接AWS服务器 云服务器上安装MySQL参考教程 linux-安装MySQL&#xff1a;https://blog.csdn.net/xhmico/article/details/125197747云端服务器(linux版)部署mysql&#xff1a;https://blog.csdn.net/m0_51406695/article/details/123886966linux云服务器从零开始安装mysq…

你不能错过的【Python爬虫】测试2(完整源代码+架构+结果)

目录 一、关键工具包的环境以及版本二、架构展示三、各部分code3.1 yjs.py3.2 items.py3.3 middlewares.py3.4 pipelines.py3.5 settings.py四、结果4.1 控制台输出结果4.2 结果截图一、关键工具包的环境以及版本 scrapy:2.7.1版本(这里主要用到的工具包) 二、架构展示 三…

HyperLynx(三十二)高速串行总线仿真(四)

高速串行总线仿真&#xff08;四&#xff09; 在上节的基础上 1.通过导出到LineSim验证一个串行通道 2.快速眼图仿真 1.通过导出到LineSim验证一个串行通道 接下来&#xff0c;将导出网络到LineSim&#xff0c;并为电容分配SPICE模型。然后&#xff0c;将添加封装和串行电容…

WENO格式自动推导

简介 WENO格式是CFD中的一种高精度的数值格式。如果函数光滑&#xff0c;使用rrr个模板可以在空间上达到2r−12r-12r−1。如果出现间断&#xff0c;那么WENO格式退化为ENO格式。 理论上WENO可达任意阶精度&#xff0c;但是推导过程比较繁琐。本文使用Mathematica软件完成WENO…

一个简单的HTML网页(千与千寻电影) 大二学生网页设计与制作 电影主题网页制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

C++ 多态之虚函数表

虚函数表概述 C 的多态&#xff0c;使用动态绑定的技术,技术的核心是虚函数表&#xff08;简称虚表&#xff09;&#xff0c;每个包含了虚函数的类都包含一个虚表&#xff0c;虚表是属于类的&#xff0c;而不是属于某个具体的对象&#xff0c;一个类只需要一个虚表即可。同一个…

猴子也能学会的jQuery第十期——jQuery元素操作(下)

&#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引用jQuery 猴子也能学会的jQuery第三期——使用jQuery 猴子也能学会的jQuery第四期——jQuery选择器大全 猴子也能学会的jQuery第五期——jQuery样式操作…