首页 > 编程语言 >代码随想录算法训练营第十三天|二叉树理论基础,144.二叉树的前序遍历,145.二叉树的中序遍历,94.二叉树的后序遍历,层序遍历合集

代码随想录算法训练营第十三天|二叉树理论基础,144.二叉树的前序遍历,145.二叉树的中序遍历,94.二叉树的后序遍历,层序遍历合集

时间:2024-08-13 12:23:42浏览次数:17  
标签:遍历 代码 前序 二叉树 可点 节点 第十三天

day12周日放假

二叉树理论基础:

文章链接:代码随想录

文章摘要:

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

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

看完有人可能会有点懵(讲的有点难理解),下面是图例

二叉搜索树定义

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

它的左、右子树也分别为二叉搜索树

二叉搜索树是一个有序树。

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

如图(注意:以下均为二叉搜索树,但有的不是平衡二叉搜索树)

二叉树的定义写法 : 

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

力扣题部分:

144.二叉树的前序遍历

题目链接:. - 力扣(LeetCode)

题面:

        给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

思路(递归法):

写好一个递归需要三步:

确定递归函数的参数和返回值:因为要打印出前序遍历节点的数值,所以参数里需要传入vector来放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返回值,所以递归函数返回类型就是void。

确定终止条件:在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要结束了,所以如果当前遍历的这个节点是空,就直接return

确定单层递归的逻辑:前序遍历是中左右的顺序,所以在单层递归的逻辑,是要先取中节点的数值

代码实现:

思路(迭代法):

        通过栈来访问树,不断把根节点放入栈里然后往左延伸,直到左子树没有了之后慢慢回弹访问右节点,前序遍历在第一次访问时就可以放进数组里了。

代码实现:

94.二叉树的中序遍历

题目链接:. - 力扣(LeetCode)

题面:

        给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

思路(递归法):

        基本同前序遍历,不同的是——前序遍历是中左右的顺序,中序遍历是左中右的顺序

代码实现:

思路(迭代法):

        基本同前序遍历。改动了输出的位置,第二次访问(也就是出栈时)输入进数组

代码实现:

145.二叉树的后序遍历

题目链接:. - 力扣(LeetCode)

题面:

        给你二叉树的根节点 root ,返回它节点值的 后序 遍历。

思路(递归法):

        基本同前序遍历,不同的是——前序遍历是中左右的顺序,后序遍历是左右中的顺序

代码实现:

思路(迭代法):

        比前两次麻烦,因为按这样的模式遍历,第三次遍历时才能输出,为了确认出栈时是第三次而不是第二次,需要一个unordered_map记录了。

代码实现:

层序遍历合集(我要打十个!)

被这么多题吓到了?

其实这些题的ac代码和第一道题不同的只有几行,这也正是十道题一口气放出来的原因。

102.二叉树的层序遍历(题目为可点链接)

思路:

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上

先将第一层(也就是根节点)压到队列内,计算size(第一层有个节点,size = 1)然后开始第一层的for循环,然后将当前层不为空的左右节点放进队列,由于我们早就记录了size,不用担心这一层的数据读完后直接开始读下一层导致的混乱,每层for循环里会把记录的数据放进数组vec里,结束后放进result内,然后重新定义vec继续记录下一行,直到当前层一个节点都没有,然后退出循环。

(注意:一定只能先把size计算出来,for循环内会改变q.size(),不能将结束条件直接跟q.size()挂钩)

代码实现: 

107.二叉树的层次遍历II(题目为可点链接)

思路:

        没啥好说的,最后反转一下就好了。

代码实现:

199.二叉树的右视图(题目为可点链接)

思路: 

        也没啥好说的,只需要记录每层末尾就行了

代码实现: 

637.二叉树的层平均值(题目为可点链接)

思路:

        没啥好说的+1,记得数据改double就行

代码实现:

429.N叉树的层序遍历(题目为可点链接)

思路:

        由于树是N叉树,所以在将当前节点子树压入队列是需要调整代码,用一个for循环搞定即可

代码实现:

515.在每个树行中找最大值(题目为可点链接)

思路:

        和右视图如出一辙,一个找最右边,一个找最大。

代码实现:

116.填充每个节点的下一个右侧节点指针(题目为可点链接)

思路:

        遍历每层时遍历到非当前层最后一个元素时(也就是当i != size - 1时),为遍历到的元素找层序遍历的下一个(也就是q.pop()完后的q.front()),理解层序遍历的本质,这道题也就是按着思路稍微改改而已。

代码实现:

​​​​​​​​​​​​​​117.填充每个节点的下一个右侧节点指针II(题目为可点链接)​​​​​​

思路:  

        乍一看感觉和上一道题思路一模一样也没啥问题。然而......事实就是这样 ╮( ̄▽ ̄")╭

因为层序遍历的模式可以不需要考虑所给的树是否为完全二叉树。 

代码实现:

​​​​​​​

104.二叉树的最大深度(题目为可点链接)

思路:

        加个计数器,每遍历一层加一就好了。

代码实现:

​​​​​​​

111.二叉树的最小深度(题目为可点链接)

思路:

        和上面也就差一行:当遍历到叶子节点直接return high + 1;(每层遍历完后high才会+1,由于当前层没有遍历完我们就直接return了,所以不能return high,而是要return high + 1。)

代码实现:

标签:遍历,代码,前序,二叉树,可点,节点,第十三天
From: https://blog.csdn.net/b1ankwall/article/details/141102955

相关文章

  • delphi里的 low to high遍历
    在Delphi中,Low和High是两个非常有用的函数,它们分别用于获取枚举类型、数组、字符串或其他有序类型的最小值和最大值。当你想要遍历这些类型的所有可能值时,Low和High函数就显得特别有用。以下是关于如何使用Low和High函数进行遍历的详细说明:遍历枚举对于枚举类型,Low......
  • 数据结构:链式二叉树(1)
    目录前言一、链式二叉树的遍历1.1前序遍历1.2中序遍历 1.3后序遍历二、层序遍历前言  通过前面关于二叉树的基础知识我们知道链式二叉树分为二叉链和三叉链,本篇主要讲的是二叉链的实现,在此之前,为了方便实现链式二叉树的各个功能,我们需要先手动快速创建一个链......
  • 数据结构----二叉树
              小编会一直更新数据结构相关方面的知识,使用的语言是Java,但是其中的逻辑和思路并不影响,如果感兴趣可以关注合集。    希望大家看完之后可以自己去手敲实现一遍,同时在最后我也列出一些基本和经典的题目,可以尝试做一下。大家也可以自己去力扣或者......
  • 数据结构:顺序二叉树(堆)
    目录前言一、堆的实现 1.1头文件1.2堆的初始化及销毁1.3 堆的插入1.4堆的删除1.5取堆顶数据和判空前言   前面我们讲了二叉树有顺序结构和链式结构,今天就来讲一下顺序结构  普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而......
  • 二叉树的遍历
    前言二叉树有三种遍历方式,三种遍历方式的核心都是把一颗二叉树分为根、左子树、右子树三部分。前中后其实说的是根出现的顺序,在二叉树中左子树遍历顺序始终先于右子树。分析以这个二叉树为例讲解,一颗二叉树分为根、左子树、右子树。空树是最小单位已经不能再分最先分为根1......
  • P1305 新二叉树【递归】
    新二叉树题目描述输入一串二叉树,输出其前序遍历。输入格式第一行为二叉树的节点数nnn。(1≤......
  • 【二叉树】递归遍历
    以如下二叉树为例:1/\23/\45leetcode144:二叉树的前序遍历代码实现(Python):#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#......
  • 二叉树基础OJ题
    前言二叉树学到现在,我们对递归已经一定程序上的理解了,所有这里为了加深我们对二叉树递归的掌握,我会分享几道基础的练习题来巩固加深我们对二叉树的理解这里拿出一些二叉树OJ题,我会写出过程详解,如有错误还望指正!题源来自于牛客网和力扣单值二叉树这题需要判断每个节点的值......
  • 【数据结构与算法】输出二叉树中从每个叶子结点到根结点的路径 C++实现(二叉树+栈+深度
    二叉树叶子节点到根节点的路径题目描述给定一棵二叉树的后序遍历序列post[s1..t1]和中序遍历序列in[s2..t2],设计一个算法,输出二叉树中从每个叶子节点到根节点的路径。请使用栈的数据结构解决。输入格式输入包括两行:第一行为后序遍历序列post[s1..t1]。第二行为中序......
  • 二叉树的学习
    目录树形结构树中的概念树的表示方法二叉树二叉树的重要性质二叉树的存储遍历中序遍历后续遍历层序遍历创建二叉树二叉树的遍历获取树中节点个数获取叶子节点的个数获取第k层节点个数获取二叉树的高度检测val元素是否存在二叉树相关题目检查两棵树是否相......