还是保持的每天2到3题,复习涉及到的就重新写一遍,树这部分大多还都是数据结构的理解,没什么算法的感觉,可以提前去简单看一下树这部分的基础知识,再上手.
-------------逐题思路+代码---------------------
思路:树的遍历都离不开递归,中序遍历就是 左根右 的顺序,然后递归出口就找到为null的就行,每次都把当前的节点加到结果集合里面
代码:
------------------------------------------------------------------------------------------------------
思路:
求深度就递归 出口就是叶子结点为null
很明显的思路就是递归,那么递归要返回什么是核心,
应该返回当前节点下面俩个节点各自的最大深度进行一个比较,然后再在这个最深的那个几点到基础上+1.
代码:
------------------------------------------------------------------------------------------------------
思路: 依旧是递归,要先递归左右节点,再进行当前节点左右的反转操作
代码:
------------------------------------------------------------------------------------------------------
思路:
遍历树需要递归+判断对称要用到两个指针pq让他俩同时对称着走,
递归左右节点的时候要注意
1.条件同时为空 与 其中一个空
2.递归调用自己的时候要让子节点对称进行(p.left,q.right)如此
代码:
------------------------------------------------------------------------------------------------------
思路: 这个和深度类似,当前节点左右两个深度和
二叉树直径-与求深度有关系-求最长 左深度+右深度
注意要return -1
代码:
------------------------------------------------------------------------------------------------------
思路:层序遍历要用队列辅助完成
用队列把每一层的放进去,出的时候把对应节点的左右加进来
每一次循环先判断大小
代码:
------------------------------------------------------------------------------------------------------
思路:
这里主要根据二叉搜索树的性质来实现
核心就是要保证根节点是数组中间的点就可.
然后递归构造左右子树.
代码:
------------------------------------------------------------------------------------------------------
思路:
递归的时候要根据二叉搜索树的性质来,要求的最小值和最大值作为参数传递进去,递归出口是为空的时候
代码:
------------------------------------------------------------------------------------------------------
思路:这个题的前置条件要掌握中序遍历,
解释一下,中序遍历结果为升序,然后这样第k个就是咱们要找的
每次都判断是不是k个
代码:
------------------------------------------------------------------------------------------------------
思路:这道题一眼思路是层序遍历,然后取最后一个放到结果集
代码:
------------------------------------------------------------------------------------------------------
思路:
这道题涉及到先序遍历, 然后第一次做的时候的疑惑点是我直接递归把节点指向改了会不会导致后面丢失一部分.
所以这部分应该先先序遍历放集合里面,再循环构建链表
代码:
------------------------------------------------------------------------------------------------------
思路:这道题涉及数据结构树的基本知识,大家可以去简单了解一下相关视频,这里简单来说就是根据中序遍历找到根节点,再根据前序遍历,构建左右
代码:
------------------------------------------------------------------------------------------------------
思路:这里可以类比求直径的思路,
1.递归每一个节点
2.根据每一个节点进行左右子节点总和进行判断
当前节点路径值等于目标的数目+左右子节点符合的数目
代码:
------------------------------------------------------------------------------------------------------
思路:
判断祖先要从qp指针往上走去找符合的
要把每个节点对应的父节点映射起来-->map
先递归,把映射的map填好
然后再根据qp两个节点,一直往上循环走,
把p路径上的经过的节点都放到set里,
再走q的时候,要是set集合里面有就说明是
代码:
------------------------------------------------------------------------------------------------------
思路:
这道题比较唬人,但是掌握最大价值(贡献值)这个概念就简单了,
递归看每一个节点,
先看左右节点的贡献值,只去大于0的
再计算以当前节点构建的最大路径和,本节点值+左右节点贡献值
与之前的res结果相比较,保留大的
然后递归返回这个节点的贡献值-->根节点值+左/右其中一个的贡献值
这里拿力扣官方题解图方便大家理解贡献值的概念
代码:
-----------------------------------------------------------------------------------------------