算法力扣刷题 三十五【二叉树基础和递归遍历】

devtools/2024/12/22 15:30:23/

前言

进入二叉树学习。
继续。


一、二叉树基础理论

理论篇——参考链接

以下是大纲:


二、遍历方式

学习递归法实现前、中、后遍历方法。

“输入”阶段

此处用了第一次递归法实现 根据题目的双指针操作,传递递归的参数。

解释递归

(1)递归:自己调用自己。重复执行一段代码,但是和循环有区别。
(2)过程:先传递,不到终止条件,继续传递;还不到终止条件,继续传递;……if判断到终止条件,开始return;返回上一层,从调用之后继续执行,结束后;再返回上一层,从调用自己之后继续执行,结束后;继续往上,直到第一层。
在这里插入图片描述

如何写好递归?

(1)前序遍历:

  • 确定递归函数的参数和返回值
    • 参数需要时可以再补充。一般需要传入root根节点数组用来存放结果
    • 返回值一般void。
  • 确定终止条件
    • if(cur == NULL) ,返回。
  • 确定单层递归的逻辑
    在这里插入图片描述
    (2)中序和后序同理。

“输出”阶段

前序遍历题目:【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 traversal(TreeNode* cur, vector<int>& record){//终止条件if(cur == nullptr){return;}record.push_back(cur->val);//把根节点放入;traversal(cur->left,record);traversal(cur->right,record);}vector<int> preorderTraversal(TreeNode* root) {vector<int> result;traversal(root,result); //返回到这一层,说明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 traversal(TreeNode* cur,vector<int>& record){if(cur == nullptr){return;}traversal(cur->left,record);//先左子树record.push_back(cur->val);//再根节点traversal(cur->right,record);//再右子树}vector<int> inorderTraversal(TreeNode* root) {vector<int> result;traversal(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 traversal(TreeNode* cur,vector<int>& record){if(cur == nullptr){return;}traversal(cur->left,record);    //先左子树traversal(cur->right,record);   //再右子树record.push_back(cur->val);     //再放入根节点}vector<int> postorderTraversal(TreeNode* root) {vector<int> result;traversal(root,result);return result;}
};

总结

  • 为二叉树基础理论建立大纲:种类、遍历方式、存储结构。
  • 递归算法学习。建立递归的模版,确定终止条件和逻辑;
  • 二叉树前、中、后序遍历实现。

(欢迎指正,转载表明出处)


http://www.ppmy.cn/devtools/58237.html

相关文章

Github绑定自己的域名

Github绑定自己的域名 1.注册自己的域名2.在GitHUb上创建一个自己的仓库&#xff0c;添加域名2.1 创建仓库2.2 添加域名2.3 在Setting中将域名添加到Custom domain中 3.添加域名解析获取ip地址4.在阿里云修改域名解析记录5.ping 域名即可成功 详细内容可参该博客&#xff1a; …

java面试-java基础(上)

文章目录 一、什么是Java&#xff1f;特点&#xff1f;二、什么是JVM、JDK、JRE&#xff1f;三、java跨平台实现原理四、java数据类型有哪些?五、char能不能存一个中文汉字?六、存在数字i加1小于i或者i减1小于i?七、什么是自动类型转换与强制类型转换?八、什么是装/拆箱&am…

【qt】如何获取网卡的信息?

网卡不只一种,有有线的,有无线的等等 我们用QNetworkInterface类的静态函数allInterfaces() 来获取所有的网卡 返回的是一个网卡的容器. 然后我们对每个网卡来获取其设备名称和硬件地址 可以通过静态函数humanReadableName() 来获取设备名称 可以通过静态函数**hardwareAddre…

精通Perl正则表达式修饰符:提升文本处理能力的艺术

Perl语言以其强大的文本处理能力而闻名&#xff0c;其中正则表达式是其核心特性之一。正则表达式本身非常强大&#xff0c;但Perl提供的修饰符&#xff08;Modifiers&#xff09;进一步扩展了正则表达式的灵活性和表达能力。本文将深入探讨Perl中正则表达式修饰符的使用&#x…

3-7 使用深度学习解决温度即示数问题

3-7 使用深度学习解决温度即示数问题 直接上代码 %matplotlib inline import matplotlib.pyplot as plt import numpy as np import torch torch.set_printoptions(edgeitems2, linewidth75)设置Jupyter Notebook在单元格中内嵌显示图像&#xff0c;导入所需库并设置PyTorch的…

如何用CSS3画一条0.5px的直线?

在 CSS 中&#xff0c;实际上无法直接指定 0.5px 的线条粗细&#xff0c;因为 CSS 中的像素单位是最小单位&#xff0c;通常无法表示小数像素。但是&#xff0c;可以通过一些技巧来模拟出看起来像是 0.5px 粗细的线条&#xff0c;例如使用伪元素和缩放等技巧。 以下是一种近似…

vue 中 使用腾讯地图 (动态引用腾讯地图及使用签名验证)

在设置定位的时候使用 腾讯地图 选择地址 在 mounted中引入腾讯地图&#xff1a; this.website.mapKey 为地图的 key // 异步加载腾讯地图APIconst script document.createElement(script);script.type text/javascript;script.src https://map.qq.com/api/js?v2.exp&…

QT C++(QT控件 QLabel,QLCDNumber,QProgressBar,QCalendarWidget)

文章目录 1. QLabel2. QLCDNumber3. QProgressBar4. QCalendarWidget 1. QLabel QLabel常见属性&#xff1a; text&#xff1a;QLabel中的文本textFormat&#xff1a;文本中的格式 Qt::PlainText:纯文本Qt::RichText:富文本&#xff0c;支持html标签Qt::MarkdownText markdow…