作者简介:大家好,我是未央;
博客首页:未央.303
系列专栏:牛客面试必刷TOP101
每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!!
前言
一、 二叉树的中序遍历
题目描述
题目解析
二、求二叉树的层序遍历
题目描述
题目解析
总结
前言
一、 二叉树的中序遍历
题目描述
描述:
给定一个二叉树的根节点root,返回它的中序遍历结果。
数据范围:树上节点数满足 0≤n≤1000,树上每个节点的值满足 −1000≤val≤1000;
进阶:空间复杂度 O(n),时间复杂度 O(n)。
示例1:
示例2:
示例3:
示例4:
题目解析
解题思路:
方法一:递归(推荐使用)
知识点:二叉树递归
二叉树的递归,则是将某个节点的左子树、右子树看成一颗完整的树,那么对于子树的访问或者操作就是对于原树的访问或者操作的子问题,因此可以自我调用函数不断进入子树。
思路:
什么是二叉树的中序遍历,简单来说就是“左根右”,展开来说就是对于一棵二叉树,我们优先访问它的左子树,等到左子树全部节点都访问完毕,再访问根节点,最后访问右子树。同时访问子树的时候,顺序也与访问整棵树相同。
从上述对于中序遍历的解释中,我们不难发现它存在递归的子问题,根节点的左右子树访问方式与原本的树相同,可以看成一颗树进行中序遍历,因此可以用递归处理:
- 终止条件: 当子问题到达叶子节点后,后一个不管左右都是空,因此遇到空节点就返回。
- 返回值: 每次处理完子问题后,就是将子问题访问过的元素返回,依次存入了数组中。
- 本级任务: 每个子问题优先访问左子树的子问题,等到左子树的结果返回后,再访问自己的根节点,然后进入右子树。
解题步骤:
- step 1:准备数组用来记录遍历到的节点值,Java可以用List,C++可以直接用vector。
- step 2:从根节点开始进入递归,遇到空节点就返回,否则优先进入左子树进行递归访问。
- step 3:左子树访问完毕再回到根节点访问。
- step 4:最后进入根节点的右子树进行递归。
代码编写:
二、求二叉树的层序遍历
题目描述
描述:
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
举例说明:
给定的二叉树是{3,9,20,#,#,15,7},
该二叉树层序遍历的结果是:
[
[3],
[9,20],
[15,7]]
提示: 0 <= 二叉树的结点数 <= 1500;
示例1:
示例2:
题目解析
解题思路:
题目的主要信息:
- 将给定二叉树按行从上到下、从左到右的顺序输出;
- 输出到一个二维数组中,数组中每行就是二叉树的一层;
方法一:队列(推荐使用)
知识点:队列
队列是一种仅支持在表尾进行插入操作、在表头进行删除操作的线性表,插入端称为队尾,删除端称为队首,因整体类似排队的队伍而得名。它满足先进先出的性质,元素入队即将新元素加在队列的尾,元素出队即将队首元素取出,它后一个作为新的队首。
思路:
二叉树的层次遍历就是按照从上到下每行,然后每行中从左到右依次遍历,得到的二叉树的元素值。对于层次遍历,我们通常会使用队列来辅助:
因为队列是一种先进先出的数据结构,我们依照它的性质,如果从左到右访问完一行节点,并在访问的时候依次把它们的子节点加入队列,那么它们的子节点也是从左到右的次序,且排在本行节点的后面,因此队列中出现的顺序正好也是从左到右,正好符合层次遍历的特点。
解题步骤:
- step 1:首先判断二叉树是否为空,空树没有遍历结果。
- step 2:建立辅助队列,根节点首先进入队列。不管层次怎么访问,根节点一定是第一个,那它肯定排在队伍的最前面。
- step 3:每次进入一层,统计队列中元素的个数。因为每当访问完一层,下一层作为这一层的子节点,一定都加入队列,而再下一层还没有加入,因此此时队列中的元素个数就是这一层的元素个数。
- step 4:每次遍历这一层这么多的节点数,将其依次从队列中弹出,然后加入这一行的一维数组中,如果它们有子节点,依次加入队列排队等待访问。
- step 5:访问完这一层的元素后,将这个一维数组加入二维数组中,再访问下一层。
图示过程解析:
代码编写: