513.找树左下角的值
文档和视频讲解:代码随想录(programmercarl.com)
状态:ac
用时:1h
思路:找到最大深度的那一层叶子节点的最左边,迭代思路比较简单,就是把层序遍历每一层,把第一个遍历到的节点的数字放入一个变量中即可。
递归思路下,其实也是递归找到最大深度,最左边的节点只要保证先遍历左边节点,在每次更新最大深度时,肯定都是最左边的节点最先遍历到。无需返回值,参数需要加上当前深度值。终止条件是在遇到叶子节点时更新最大深度和最左节点。递归逻辑就是向下遍历左右子节点,然后回溯。
代码:
112. 路径总和 113.路径总和ii
文档和视频讲解:代码随想录(programmercarl.com)
状态:ac(看了题解)
用时:2h
思路:112的递归思路,在递归的同时使用计数器统计和,每次遍历一个节点时减去左右儿子的值,当到达叶子节点时,且计数器为0的时候,返回true。递归返回值是bool,在遇到合适的路径的时候及时返回,参数为节点指针和计数器。终止条件是遇到叶子节点并且计数器为0。
112的迭代思路就是用两个栈,一个栈用来处理树的遍历,另外一个用来模拟递归的计数器。
113的思路和112类似,但是由于要存放路径,需要一个存放path的容器即可。
代码:
106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树
文档和视频讲解:代码随想录(programmercarl.com)
状态:ac(看了题解)
用时:2h
思路:后序的最后节点元素作为中序序列的切割点,来不断进行中序序列的拆分,通过递归层层分割,大致为以下几步:
切割中序的到两边的序列的长度和后序应该切割的两个序列的长度应该一样。
前序和中序构造同理。
代码:
注:想较于106,多加了一个hash map存放前序序列每个元素的索引,省去每次递归都要冲头计算分割点的索引位置。