二叉树part07
LC530二叉搜索树的最小绝对差
- 暴力解法:将二叉树转换为有序数组,然后求有序数组的最小绝对差
- 思路:跟昨天的判断是否是搜索二叉树类型,采用中序遍历的方法,并保留一个pre用来记录前一个节点的值,一个result记录结果
- 递归终止条件:当cur==null是空节点,终止递归
- 更新结果:当pre!=-1时,更新结果
- 代码
LC501二叉搜索树中的众数
- 暴力方法(超时7min),超时分析
- HashMap的遍历方式掌握不是很熟悉
- Collection<> list = map.values():获取map集合中的所有value
- Set<> set = map.keySet():获取map集合中的所有key
- list转换为数组不熟悉:T[] result = list.toArray(new T[0])
- 数组转换为list:List list = Arrays.asList(T[])
- HashMap的遍历方式掌握不是很熟悉
- 代码:
- 递归方法(未掌握)
- 因为是二叉搜索树,因此采用中序遍历的递归方式,只不过需要初始化的变量多了一些
- 需要统计元素,因此需要初始化list
- 需要记录前一个元素和目前元素的对比,因此需要初始化前一个元素的值
- 需要记录当前频率count
- 需要记录出现最多的频率maxCount
- 递归中间的判定条件
- 如果pre的值与cur的值相等:当前频率count++,不等,更新pre和count
- 判断当前频率与最大频率,count>maxCount,之前记录的最大频率失效,需要更新list和maxCount,list.clear()。count==maxCount,list添加元素
- 因为是二叉搜索树,因此采用中序遍历的递归方式,只不过需要初始化的变量多了一些
- 代码
LC236二叉树的最近公共祖先(未掌握)
- 思路:首先想的是要是能自底向上查找就好了,这样就可以找到公共祖先了=》后序遍历(左右中)根据左右子树的返回值,来处理中节点的逻辑
- 其实left和right表示的含义是:我所在是子树中是否存在p和q,如果左右子树都存在直接return root
- 一个为空return不为空的那个
- 都为空直接return null
- 递归终止条件:root==null的时候,需要注意的是当root==p || roo==q(这也是想岔的原因)
- 代码