代码随想录刷题题Day11

刷题的第十一天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++ / Python
Day11 任务
● 理论基础
● 递归遍历
● 迭代遍历
● 统一迭代

1 二叉树理论基础

1.1 二叉树的种类

(1)满二叉树
在这里插入图片描述
深度为 k k k,有 2 k − 1 2^k-1 2k1个节点的二叉树
(2)完全二叉树

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

在这里插入图片描述
优先级队列其实是一个堆,堆就是一棵完全二叉树,同时保证父子节点的顺序关系
(3)二叉搜索树
前面的树,没有数值,而二叉搜索树是有数值的,二叉搜索树是一个有序树

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

在这里插入图片描述
(4)平衡二叉搜索树
平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
在这里插入图片描述
C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是 l o g n logn logn

1.2 二叉树的存储方式

链式存储和顺序存储

顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起

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

如果父节点的数组下标是 i i i,左孩子就是 i ∗ 2 + 1 i * 2+1 i2+1,右孩子就是 i ∗ 2 + 2 i * 2+2 i2+2

1.3 二叉树的遍历方式

二叉树主要有两种遍历方式:

  1. 深度优先遍历:先往深走,遇到叶子节点再往回走。
  2. 广度优先遍历:一层一层的去遍历。

深度优先遍历:

  1. 前序遍历(递归法,迭代法)中左右
  2. 中序遍历(递归法,迭代法)左中右
  3. 后序遍历(递归法,迭代法)左右中

这里前中后,其实指的就是中间节点的遍历顺序
在这里插入图片描述
前中后序遍历的逻辑其实都是可以借助栈使用递归的方式来实现的
广度优先遍历

层次遍历(迭代法)

广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树

这两种遍历是图论中最基本的两种遍历方式

1.4 二叉树的定义

C++:

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

Python:

class TreeNode:def __init__(self, val, left = None, right = None):self.val = valself.left = leftself.right = right

2 递归遍历

递归的三要素:

  1. 确定递归函数的参数和返回值

确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型

  1. 确定终止条件

运行遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出

  1. 确定单层递归的逻辑

确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程

前序遍历:
(1)确定递归函数的参数和返回值

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

(2)确定终止条件

if (cur == NULL) return;

(3)确定单层递归的逻辑
前序遍历是中左右

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

C++:

class Solution {
public:void traversal(TreeNode* cur, vector<int>& vec){if (cur == NULL) return;vec.push_back(cur->val);   // 中traversal(cur->left, vec); // 左traversal(cur->right, vec);// 右}vector<int> preorderTraversal(TreeNode* root) {vector<int> result;traversal(root, result);return result;}
};

Python:

class Solution(object):def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""if not root:return []left = self.preorderTraversal(root.left)right = self.preorderTraversal(root.right)return [root.val] + left + right

中序遍历:
C++:

class Solution {
public:void traversal(TreeNode* cur, vector<int>& vec){if (cur == NULL) return;traversal(cur->left, vec); // 左vec.push_back(cur->val);   // 中traversal(cur->right, vec);// 右}vector<int> inorderTraversal(TreeNode* root) {vector<int> result;traversal(root, result);return result;}
};

Python:

class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""if not root:return []left = self.inorderTraversal(root.left)right = self.inorderTraversal(root.right)return left + [root.val] + right

后序遍历:
C++:

class Solution {
public:void traversal(TreeNode* cur, vector<int>& vec){if (cur == NULL) return;traversal(cur->left, vec);  // 左traversal(cur->right, vec); // 右vec.push_back(cur->val);    // 中}vector<int> postorderTraversal(TreeNode* root) {vector<int> result;traversal(root, result);return result;}
};

Python:

class Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""if not root:return []left = self.postorderTraversal(root.left)right = self.postorderTraversal(root.right)return left + right + [root.val]

3 迭代遍历

递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因
用栈也可以实现二叉树的前后中序遍历

3.1 前序遍历(迭代法)

前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。

出栈的时候才是中左右的顺序

在这里插入图片描述
C++:

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> result;st.push(root);while (!st.empty()){TreeNode* node = st.top();// 中st.pop();if (node != NULL) result.push_back(node->val);else continue;st.push(node->right);// 右st.push(node->left);// 左}return result;}
};

目前的前序遍历的逻辑无法直接应用到中序遍历上

3.2 后序遍历(迭代法)

在这里插入图片描述
C++:

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> result;st.push(root);while (!st.empty()){TreeNode* node = st.top();st.pop();if (node != NULL) result.push_back(node->val);else continue;st.push(node->left);st.push(node->right);}reverse(result.begin(), result.end()); // 将结果反转之后就是左右中的顺序return result;}
};
3.3 中序遍历(迭代法)

中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中),这就造成了处理顺序和访问顺序是不一致的
在使用迭代法写中序遍历,就需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素
在这里插入图片描述

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> result;TreeNode* cur = root;stack<TreeNode*> st;while (cur != NULL || !st.empty()){if (cur != NULL)// 指针来访问节点,访问到最底层{st.push(cur);// 将访问的节点放进栈cur = cur->left;// 左}else{cur = st.top();// 从栈里弹出的数据,就是要处理的数据st.pop();result.push_back(cur->val);// 中cur = cur->right;// 右}}return result;}
};

鼓励坚持十二天的自己😀😀😀

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

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

相关文章

CentOS7安装JDK8

1. 下载JDK 下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/javase/javase8u211-later-archive-downloads.html 2. 解压JDK tar -zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local/3. 配置环境变量 打开 /etc/profile vim /etc/profile末尾加上 export…

一文了解 Go 方法

前言 在前面的 一文熟悉 Go 函数 文章中&#xff0c;介绍了 Go 函数的声明&#xff0c;函数的几种形式如匿名函数、闭包、基于函数的自定义类型和函数参数详解等&#xff0c;而本文将对方法进行介绍&#xff0c;方法的本质就是函数&#xff0c;介绍方法的同时也会顺带对比其与函…

算法基础之分解质因数

分解质因数 核心思想&#xff1a;试除法(从小到大枚举所有数) #include<iostream>#include<algorithm>using namespace std;void div(int n){for(int i2;i<n/i;i){if(n%i 0) //找到最小质数i{int s0;while(n%i 0){n/i;s; //记录指数}cout<<i<<&…

js基础:简介、变量与数据类型、流程循环控制语句、数组及其api

JS基础&#xff1a;简介、变量与数据类型、流程循环控制语句、数组及其api 一、简介 1、js概述 tip&#xff1a;JavaScript是什么&#xff1f; 有什么作用&#xff1f; JavaScript&#xff08;简称JS&#xff09;是一种轻量级的、解释性的编程语言&#xff0c;主要用于在网页…

React系列:实现子组件A->父组件-子组件B变量流传

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家,51CTO明日之星 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥网站:vip.zsqt.cc React系列总结 🎈useState的使用 创建响应式变量的时候,在react是需要使用u…

企业核心架构(高可用 ,高并发 ,高复用)

标题&#xff1a;构建高可用、高并发和高复用的应用系统 摘要&#xff1a;在当今互联网时代&#xff0c;提供高可用、高并发和高复用的应用系统对于确保用户体验和系统稳定性至关重要。本文将介绍一些常用的技术和最佳实践&#xff0c;以实现高可用性、高并发性和高复用性。并…

手机网站支付有风险吗?

这是一个在当今数字化时代中&#xff0c;消费者们常常会提出的问题。随着科技的发展和移动设备的普及&#xff0c;越来越多的商家开始接受在线支付&#xff0c;这无疑为消费者提供了极大的便利。然而&#xff0c;与此同时&#xff0c;也伴随着一些潜在的风险。本文将探讨手机网…

0012Java程序设计-ssm医院预约挂号及排队叫号系统

文章目录 **摘** **要**目 录系统实现5.2后端功能模块5.2.1管理员功能模块5.2.2医生功能模块 开发环境 摘 要 网络的广泛应用给生活带来了十分的便利。所以把医院预约挂号及排队叫号管理与现在网络相结合&#xff0c;利用java技术建设医院预约挂号及排队叫号系统&#xff0c;实…

Nginx安装【保姆级别】

目录 1.Nginx开源版本安装&#x1f495;&#x1f495;&#x1f495; 2.传到linux&#x1f495;&#x1f495;&#x1f495; 3.在linux上安装 &#x1f495;&#x1f495;&#x1f495; 4.启动Nginx &#x1f495;&#x1f495;&#x1f495; 5.安装成系统服务 &#x1f495…

【1day】复现飞企互联 FE业务协作平台editflow_manager文件SQL注入漏洞

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现

Dockerfile创建镜像INMP+wordpress

Dockerfile创建镜像INMPwordpress 需要哪些呢&#xff1a; Nginx 172.111.0.10 docker-nginx Mysql 172.111.0.20 docker-mysql PHP 172.111.0.30 docker-PHP 开始实验&#xff1a; 创建各级目录&#xff0c;他们各自的包和配置文件必须要在同一目录下才可以生效&…

Fiddler中AutoResponder的简单使用

AutoResponder&#xff0c;自动回复器&#xff0c;用于将 HTTP 请求重定向为指定的返回类型。 这个功能有点像是一个代理转发器&#xff0c;可以将某一请求的响应结果替换成指定的资源&#xff0c;可以是某个页面也可以是某个本地文件 1.使用 打开“Fiddler”&#xff0c;点击…

掌握iText:轻松处理PDF文档-高级篇-加密和解密

前言 iText作为一个功能强大、灵活且广泛应用的PDF处理工具&#xff0c;在实际项目中发挥着重要作用。通过这些文章&#xff0c;读者可以深入了解如何利用iText进行PDF的创建、编辑、加密和提取文本等操作&#xff0c;为日常开发工作提供了宝贵的参考和指导。 掌握iText&#…

【Vue】router.push用法实现路由跳转

目录 router.push用法 在Login.vue中 在Register.vue中 ​ 上一篇&#xff1a;登录与注册界面的制作 https://blog.csdn.net/m0_67930426/article/details/134895214?spm1001.2014.3001.5502 制作了登录与注册界面&#xff0c;并介绍了相关表单元素即属性的用法 在登录页面…

Docker笔记:关于Dockerfile及构建镜像

Dockerfile 的作用 Dockerfile让docker命令变得更简单&#xff0c;是用于构建docker镜像&#xff0c;实现自动化部署 Dockerfile 构建自己的centos镜像 这里有一个应用场景&#xff0c;创建一个自己的centos镜像&#xff0c;这个镜像有我们所需的软件 可以将我们一系列的操作…

人大金仓V8R6进阶授权操作

授权用户myuser在模式myschema 单表的所有权限 GRANT ALL ON TABLE "myschema"."mytable" to "myuser"; 授权用户myuser在模式myschema 单表的查询权限 GRANT SELECT ON TABLE "myschema"."mytable" to "myuser";…

jQuery遍历与删除添加节点

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

手拉手探索JSONCrack数据可视化

JSON Crack数据可视化工具 官网&#xff1a;https://jsoncrack.com/ 项目地址&#xff1a;https://github.com/AykutSarac/jsoncrack.com SON Crack 是一个很方便的 JSON 数据可视化工具。 该项目不是简单的展示 JSON 数据,而是将其转化为类似思维导图的形式,支持放大/缩小、展…

技术资讯:VSCode大更新,这两个功能终于有了

大家好&#xff0c;我是大澈&#xff01; 本文约1200字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01; 1. 资讯速览 就在前阵子&#xff0c;前端人都…

gcc的编译过程

gcc编译过程包括预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接。 &#xff08;1&#xff09;预处理 预处理就是对文件中带#内容的处理&#xff0c;包括宏定义&#xff0c;条件编译和头文件。 可以通过gcc -E <file> -o xxx.i 来进行预处理 查看.i 文件可发现…