代码随想录算法训练营第十四天| 二叉树part01

144. 二叉树的前序遍历

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

学习完视频二叉树基础后,首先我来尝试一下广度优先搜索:

代码随想录算法训练营第十四天| 二叉树part01_第1张图片

 

果然太久没做忘了太多,几个要点:

1 如果数为空直接返回,不然会报空指针错误

2 由于前序遍历是中左右,所以要先将中也就是根节点pop出来然后加入数组,然后检查结点有没有左右孩子。

3 很容易犯的错误,注意pop是先拿出数组尾部的结点,所以添加顺序应该是先加右后加左,这样左孩子才能被先弹出来。

然后试试递归法解决:

代码随想录算法训练营第十四天| 二叉树part01_第2张图片

 递归三部曲:(引用自代码随想录)

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

  2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

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

初始化一个数组保存结点的元素,然后然后前序遍历递归就可以了。

145. 二叉树的后序遍历 

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

首先我依然使用广度优先搜索的方法,后续遍历是左右中,看上去有点麻烦,但是发现只有按照中-右-左的顺序将元素放入数组中,将按照栈的方式从栈顶取出放入新列表中就是倒过来的左-右-中顺序了,这里我直接将列表反转输出即可。

代码随想录算法训练营第十四天| 二叉树part01_第3张图片

然后再尝试使用深度优先遍历,即递归来完成:

代码随想录算法训练营第十四天| 二叉树part01_第4张图片 

 

94. 二叉树的中序遍历

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

由于使用广度优先搜索来实现中序遍历会比较麻烦,我决定先使用递归来解决:

代码随想录算法训练营第十四天| 二叉树part01_第5张图片

 然后看一下视频来学习迭代法实现中序遍历:

写出二叉树的非递归遍历很难么?这次再带你写出中序遍历的迭代法!|二叉树的非递归遍历 | 二叉树的遍历迭代法_哔哩哔哩_bilibili

看完后理解了中序遍历的特殊性,我们需要先把根节点最左侧的结点全压入栈中,再弹出取数:

代码随想录算法训练营第十四天| 二叉树part01_第6张图片

 

整体和前序和后续的迭代法差别有点大,这也是需要经常复习的知识点。 

你可能感兴趣的:(数据结构)