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

news/2024/10/21 23:09:15/

理论基础 

二叉树的种类

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

满二叉树

满二叉树:如果一棵二叉树只有度为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.ppmy.cn/news/258724.html

相关文章

基于VMD-LSTM-IOWA-RBF的碳排放混合预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

vba 下拉多选

方法一&#xff1a;有效性验证下拉多选 建立下拉单选&#xff1a;https://jingyan.baidu.com/article/1876c85255d929890a13767d.html设置多选代码&#xff1a; Sub Worksheet_Change(ByVal Target As Range)Dim xRng As RangeDim xValue1 As StringDim xValue2 As String 为…

LINUX挂载硬盘,调整分区大小

https://www.wn789.com/22049.html https://www.wn789.com/3477.html https://blog.csdn.net/jiandanjinxin/article/details/69969217 https://www.osyunwei.com/archives/9368.html 我的Archlinux发现root(/)分区不够用了&#xff0c;于是想把/home分区的空间腾出一些来&…

如何从椭圆度 matlab,如何利用matlab画出如图潮流椭圆

clc;clear %先对分量进行调和分析,然后利用elli_para2程序计算椭圆要素,ap2ep程序画潮流椭圆 %% xlsend = [3477 3897 3477 3478]; lat_point = [39+39.922/60 39+42.356/60 39+37.024/60 39+25.933/60]; tidename = [O1 ;K1 ;M2 ;S2 ;M4 ;MS4 ]; color={r;g;…

log4j:WARN No such property [datePattern] in org.apache.log4j.RollingFileAppender.

log4j:WARN No such property [datePattern] in org.apache.log4j.RollingFileAppender.log4j:ERROR setFile(null,true) call failed.java.io.FileNotFoundException: log/log.txt (系统找不到指定的路径。) at java.io.FileOutputStream.openAppend(Native Method) at java.i…

hdu3774

/* 分析&#xff1a; 水题&#xff0c;不过题目真难读懂 - -I。 len代表绳长、sum代表所有pitch的高度之和、max最高的pitch&#xff0c; 那么&#xff1a; 1、若len<2*sum&#xff0c;则不行&#xff1b; 2、最多的人数(50(60/70)/max)1; */ #include"stdio.…

hdu3747

/* 分析&#xff1a; 读完题立刻就想到了搜索&#xff0c;不过感觉有点不对劲&#xff0c; 因为全选与反选的作用太绝对了&#xff0c;所以貌似可以找规律&#xff0c; 于是&#xff0c;下面的我用的方法就诞生了~ -、-I 仔细想想&#xff1a; (1)全选&#xff1a;要用的话第一…

[BZOJ 3477] [Usaco2014 Mar Gold] Sabotage

金组的神题喵。。 [题目描述] 给你N个数&#xff0c;第一个和最后一个不能去掉。 现希望去掉中间某段连续的数&#xff0c;使得剩下的数的平均值最小化。 之前已经做了很久&#xff0c;一直想不到正解。。然后去网上查&#xff0c;发现没有。。 又去USACO上看官方题解&#…