第二十一天 二叉树part05
LC513找树左下角的值(超时7min)
- 超时分析:对递归更新值的条件不够清晰
- 四种情况:只有左为空(值为右子树值),只有右为空(值为左子数值),左右都为空(值为cur节点的值),左右都不为空(值要判断左右子树那个子树的深度更深)
- 代码:
- 新思路:题意即要找深度最大的叶子节点。使用前序递归遍历,保证保证优先左边搜索,然后记录深度最大的叶子节点。
- 因此此时左子树先进行了判断,就算右子树是深度最大的节点,进行判断时只要定义的条件定义好就不会更新value值(if(depeh>Depth))
- 代码
- 确定终止条件:当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。因为永远是左边depth>Depth先满足条件更新value和Depth,等到右边Depth已经更新了没有机会了
- 确定终止条件:当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。因为永远是左边depth>Depth先满足条件更新value和Depth,等到右边Depth已经更新了没有机会了
- 求深度-》前序遍历-》根左右
- 因为要求左下角的值,因此要求的结果一定要是叶子节点
- 要满足左下角,因此还需要引入一个参数来观察是否是左下角
- 代码
LC112路径总和(未掌握)
- 未掌握分析:对路径题目不是很熟悉,主要没有搞懂递归的终止条件以及递归是否需要返回值(LC257二叉树的所有路径)
- 递归的终止条件
- 如果cur==null,肯定无需判断直接return false
- 如果cur是叶子节点,且sum+cur.val==targetSum说明找到了return true
- 递归是否需要返回值:如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值,需要处理递归返回值,递归函数就需要返回值。
- 递归的终止条件
- 代码:
- 最笨的方法,使用hashMap记录根节点到每一个节点的路径和,并在层序遍历的过程中判断是否是叶子节点且是叶子节点路径和是否等于targetSum
- 求深度-》前序遍历-》根左右
- 因为要求左下角的值,因此要求的结果一定要是叶子节点
- 要满足左下角,因此还需要引入一个参数来观察是否是左下角
- 代码
LC106从中序与后序遍历序列构造二叉树(超时14min,相当于未掌握)
- 超时原因分析:
- 后序遍历的最后一个元素一定是root,后序只需要在前序中找到与这个root.val相等的index
- root.left分别的以inorder的0到index-1数组和postorder0到index-1数组的递归(长度都为index)
- root.right分别的以inorder的i+1到length-1数组和postorderi到length-2数组的递归(长度都为length-i-1)搞错了长度导致超时严重
- 同时因为涉及递归,所以需要判断数组的长度是否为0,为0说明抵达了空节点,return null即可
- 对数组复制的函数不够熟悉
- Arrays.copyOfRange(int[] origin,0,i):包含下标0,不包含下标i的origin复制数组
- Arrays.copyOf(int[] origin,int length):从头开始截取长为length的origin复制数组
- 代码
LC105从前序与中序遍历序列构建二叉树
- 代码