代码随想录算法训练营15期 Day 14 | 理论基础、递归遍历、迭代遍历、统一迭代

news2025/2/24 12:36:09

理论基础 

二叉树的种类

需要了解 二叉树的种类,存储方式,遍历方式 以及二叉树的定义

满二叉树

满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。

完全二叉树 

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。

优先级队列其实是一个堆,堆就是一棵完全二叉树,同时保证父子节点的顺序关系。 

二叉搜索树

二叉搜索树是有数值的了,二叉搜索树是一个有序树

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉排序树

平衡二叉搜索树

平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_set底层实现是哈希表。 

二叉树的存储方式

二叉树可以链式存储,也可以顺序存储。链式存储方式就用指针, 顺序存储的方式就是用数组。顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起。

数组存储方式如下所示: 如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。

二叉树的遍历方式

中间节点的顺序就是所谓的遍历方式

  • 前序遍历:中左右
  • 中序遍历:左中右
  • 后序遍历:左右中

二叉树的定义 

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

递归遍历

一入递归深似海。

递归的三部曲:
①确定递归函数的参数和返回值
②确定终止条件
③确定单层递归的逻辑

前序遍历:中左右

以前序遍历为参考,进行遍历过程如下所示:
①确定递归函数的参数和返回值

void traversal(TreeNode* cur, vector<int>& vec)

②确定终止条件

if (cur == NULL) return;

③确定单层递归的逻辑

vec.push_back(cur->val);    // 中
traversal(cur->left, vec);  // 左
traversal(cur->right, vec); // 右

中序遍历:左中右 
后序遍历:左右中

前序遍历题目链接:144.前序遍历 力扣

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void pre(TreeNode* use,vector<int>& abc)
    {
        if(use==nullptr) return;
        abc.push_back(use->val);
        pre(use->left,abc);
        pre(use->right,abc);

    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        pre(root, result);
        return result;

    }
};

中序遍历题目链接:94.中序遍历力扣

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void mid(TreeNode* use,vector<int>& kv)
    {
        if(use==nullptr)
        {
            return;
        }
        mid(use->left,kv);
        kv.push_back(use->val);
        mid(use->right,kv);

    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        mid(root,result);
        return result;

    }
};

 后序遍历题目链接:145.后序遍历力扣

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void back1(TreeNode* use,vector<int>& kv)
    {
        if(use==nullptr)
        {
            return;
        }
        back1(use->left,kv);
       
        back1(use->right,kv);
        kv.push_back(use->val);

    }
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        back1(root,result);
        return result;

    }
};

 

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

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

相关文章

十年寒冰,IT老鸟告诉你如何快速入门一个编程语言 #如何系统学习一门it技术#

我个人算是学了非常多的各类编程语言了&#xff0c;从最早的.NET到后面的PHP、数据库MySQL、Redis、前端&#xff08;HTML、CSS、JS&#xff09;、公众号开发、再到后面因为工作的需要&#xff0c;学习前端工程化、NodeJs、Vue、React、以及个人学习爬虫的时候把Python也学了&a…

复合材料压缩模拟探究:选取应变分量的区别,与实验结果的对比分析

复合材料压缩模拟探究&#xff1a;选取应变分量的区别&#xff0c;与实验结果的对比分析 一、模型介绍 6641的试验件模拟。加强片是采用continuum shell&#xff0c;试验件采用每层一个单元&#xff0c;并且采用一层一个材料&#xff0c;并定义方向。 试验件材料为X850材料&a…

做接口测试必须要弄明白的7个问题

1. 为什么要进行接口测试 接口测试是软件测试中必不可少的环节之一。在软件开发过程中&#xff0c;不同的模块之间需要通过接口进行交互&#xff0c;因此对接口进行测试可以有效地检测模块间的交互是否正常&#xff0c;从而保证整个系统的质量和稳定性。 2. 接口测试的作用 接…

跨境必看!FP独立站必备安全支付方式

收款对于做F牌独立站的卖家来说至关重要&#xff0c;收款的方式有很多种&#xff0c;卖家在选择收款方式时需要关注什么&#xff1f;FP独立站必备的支付收款方式又有哪些&#xff1f;卖家又该如何选择呢&#xff1f; 一、在选择支付方式时要注意什么&#xff1f;1.安全合规&…

RPC、HTTP、DSF、Dubbo,每个都眼熟,就是不知道有什么联系?

一、HTTP 和 RPC 首先&#xff0c;http 与 rpc 有什么区别这个问题不太严谨&#xff0c;因为这俩就不是一个层级的东西。 HTTP 这个大家太熟悉了吧&#xff1f;日常接触最多的恐怕就是各种http协议的接口了。 没错&#xff0c;http它是一个协议。 其他在这里就不打算铺开了…

Nginx+Tomcat实现负载均衡、动静分离

目录 一、Nginx负载均衡实现原理 1.Nginx 实现负载均衡是通过反向代理实现 2、Nginx配置反向代理主要参数 3、动静分离原理 4、Nginx静态处理优势 5、并发量和吞吐量计算 二&#xff1a;7层反向代理 1、环境准备 ​2、配置Nginx Server 3、tomcat1 和tomcat2配置 4、 搭…

Jmeter性能测试 (入门)

Jmeter是一款优秀的开源测试工具&#xff0c; 是每个资深测试工程师&#xff0c;必须掌握的测试工具&#xff0c;熟练使用Jmeter能大大提高工作效率。 熟练使用Jmeter后&#xff0c; 能用Jmeter搞定的事情&#xff0c;你就不会使用LoadRunner了。 本文将通过一个实际的测试例…

浪涌保护器的选型和原理(SPD)

SPD是Surge Protective Device的简写&#xff0c;中文名称有&#xff1a;电涌保护器、浪涌保护器、防雷栅、雷电浪涌防护器、防雷器等。 SPD浪涌保护器其内部包含至少一个非线性元件。当电涌出现时&#xff0c;SPD能在极短的时间导通&#xff0c;将电流泄放到地&#xff0c;其…

如何有效的提升餐饮油烟的监控力度

摘要&#xff1a;现阶段餐饮行业发展十分迅速&#xff0c;为了更好地提升餐饮油烟的监控力度&#xff0c;强化餐饮业油烟在线监控系统的设计成为重中之重。油烟在线监控系统的强化可以降低油烟的排放量&#xff0c;同时在排烟的过程中&#xff0c;还可搜集到更多的数据和信息。…

用“Function“替代“eval“进行动态代码生成

一、背景 在JavaScript中我们有时会遇到这么一个场景&#xff1a;“函数可能要根据不可预知的条件执行代码”。比如说计算器中的加减乘除&#xff0c;用户无法直接将操作符"、-、*、/"作为参数传入函数中&#xff0c;因此我们一般会采取字符串形式的操作符&#xff0…

asp.net高校食谱管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net高校食谱管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net高校食谱管理系统VS开发s…

Spring - Bean的实例化流程及生命周期

文章目录 Bean的实例化流程及生命周期一、Bean实例化基本流程1.1 Bean实例化基本流程1.2 总结 二、 Bean 后处理器2.1 介绍2.2 BeanFactoryPostProcessor Bean工厂后处理器2.2.1 入门2.2.2 Bean工厂后处理器注册BeanDefinition2.2.3 BeanDefinitionRegistryPostProcessor专门注…

2023年软件测试工程师如何提升?测试工程师破局进阶...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 熟练掌握基本的测…

Java反编译工具Jad的下载与使用示例

场景 Java反编译工具-JD-GUI下载以及使用&#xff1a; Java反编译工具-JD-GUI下载以及使用_霸道流氓气质的博客-CSDN博客 上面讲过Java反编译工具JD-GUI的使用&#xff0c;如果使用jad并通过命令如何实现反编译。 为了验证Java开发手册中为什么不推荐使用进行字符串拼接&…

基于轻量级卷积神经网络模型开发构建中国象棋棋子识别系统

关于棋类相关的AI类型的项目在我之前的文章中也有过不少的实践开发经历&#xff0c;这里就不再赘述了&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《YOLOV5融合SE注意力机制和SwinTransformer模块开发实践的中国象棋检测识别分析系统》 《基于轻量级YOLO开发构建…

【IP技术】什么是IP地址?

一、IP地址概念 IP地址是一个32位的二进制数&#xff0c;它由网络ID和主机ID两部份组成&#xff0c;用来在网络中唯一的标识的一台计算机。网络ID用来标识计算机所处的网段&#xff1b;主 机ID用来标识计算机在网段中的位置。IP地址通常用4组3位十进制数表示&#xff0c;中间用…

(论文阅读)Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

论文地址 https://openreview.net/pdf?id_VjQlMeSB_J 摘要 我们探索如何生成一个思维链——一系列中间推理步骤——如何显著提高大型语言模型执行复杂推理的能力。 特别是&#xff0c;我们展示了这种推理能力如何通过一种称为思维链提示的简单方法自然地出现在足够大的语言模…

运用自动化测试脚本,测试下CSDN的登录功能模块

目录 前言 python程序目录 账号密码登录模块 测试用例执行模块 运行结果示例 前言 自动化测试的重要性越来越受到人们的重视&#xff0c;因为它可以提高测试效率、降低测试成本并减少人为错误的出现。为了满足这个需求&#xff0c;越来越多的公司开始采用自动化测试来保证…

项目跑不起来

Sa-Token/sa-token-core/src/main/java/cn/dev33/satoken/temp/SaTempUtil.java:10:8 java: 写入cn.dev33.satoken.temp.SaTempUtil时出错: Output directory is not specified 写入cn.dev33.satoken.temp.SaTempUtil时出错: Output directory is not specified 答案&#xf…

c++的概述

c是面向对象、泛型编程。 1、 第一个c程序&#xff1a; #include <iostream>using namespace std;int main(int argc, char *argv[]) {//cout代表终端输出设备 endl换行cout << "Hello World! " << endl;cout << 100 << endl;std:…