2022.10.22-23(二叉树)
1-5遍历部分个人总结概括
1.递归遍历:来自 <代码随想录>
- 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
- 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
- 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
- 2.迭代遍历:利用栈(模拟像递归一样的深度遍历),(前序遍历与后序遍历思想逻辑一致),(中序遍历单独)
- 前后序遍历:(注意:eg:前序遍历是中左右,so栈的压栈顺序是中右左)利用栈,压入根节点后进行对根节点进行标记;然后将根节点弹栈;利用标记进行遍历记录;利用标记压入右左子节点(判断是否为空);然后循环;退出循环记得弹出标记中最后的值(后序遍历记得最后翻转一下result数组)
- 中序遍历(左中右):从节点开始,利用指针的遍历一层层向下访问(左节点,同时压栈);到达树的底部(下一节点为NULL)后,利用弹栈一点点处理节点,把节点值存入result数组中,然后处理右节点。
- 统一迭代(基本利用栈进行处理):eg(中序):栈顶节点需要弹出,再进行右中左的压栈,防止重复压入;利用标记处理(当前)中节点,即对于访问过但是未处理的(当前)中节点,在其后压入一个NULL(空节点)作为标记;当栈顶元素为空节点时,可知可以开始处理结果,进行两次弹栈获得结果送入result数组;;;;
(前序,后序同理)
3.层序遍历:利用队列(先进先出),一层层实现广度遍历
因为存在层的缘故,所以每一层最好存为一个单独数组,所以一般返回值均为指针数组(每个元素存对应层数组首地址)
- 迭代法:每一层遍历时,利用当前队列元素个数(此层元素个数),来确定之后循环出队次数 ;在循环出队时,记录出队元素,结果存入数组,并利用记录压入其对应的下一层的左右子元素;循环结束后此层元素遍历完毕,将此层元素的数组首地址存入指针数组
- 递归法:返回值void(因为使用vector来记录了);参数(节点指针,vector指针数组的引用,树当前深度);终止条件(节点为空);单层递归处理信息(当result指针数组大小(存放元素个数)与深度相等时(遍历左子树建层),说明来到新一层,要存入一个新数组的首地址来存放这一层元素;然后要把对应层数的当前节点的值存入指针数组对应层数的数组内;然后去递归遍历左右子树,记得层数加一)。