Leetcode 530.二叉搜索树的最小绝对差
初始思路
题目给的很特殊,是个二叉搜索树,根据昨天的98.验证二叉搜索树可以知道,可以把二叉搜索树转变成一个有序递增的数组,然后在这个数组上求差值。
代码
var getMinimumDifference = function (root) {let arr = []const buildArr = (root) => {if (root) {buildArr(root.left)arr.push(root.val)buildArr(root.right)}}buildArr(root)// arr数组是逐渐递增的let min = arr[arr.length - 1]for (let i = 1; i < arr.length; i++){if (min > arr[i] - arr[i - 1]){min = arr[i] - arr[i - 1]}}return min};
感想
- 果然和我想的一样~利用了二叉搜索树的有序性。
- 在遍历数组的时候,我们已知了数组是非递减的,可以确定差值就存在相邻的两个元素之间,所以遍历的时候两个相减就可以了。
Leetcode 501.二叉搜索树中的众数
初始思路
按照上题的思路,进行遍历获得arr,然后映射到map上,统计出现最多的字符。
代码
var findMode = function (root) {// 使用辅助maplet map = new Map()// 递归const traverTree = (root) => {if (!root) returntraverTree(root.left)let count = map.has(root.val) ? map.get(root.val) + 1 : 1map.set(root.val, count)traverTree(root.right)}traverTree(root)let max = map.get(root.val)// 因为不一定只有一个众数,所以返回一个数组let res = []for (let [key, value] of map) {// 如果当前值等于最大出现次数就在res增加if (value === max) {res.push(key)}// 如果value的值大于原本的maxCount就清空res的所有值,因为找到了更大的if (value > max) {res = []max = valueres.push(key)}}return res};
var findMode = function (root) {// 不使用额外空间,使用中序遍历,设置出现最大次数初始值为1let count = 0, maxCount = 1;let pre = root, res = [];// 1.确定递归函数及函数参数const travelTree = function (cur) {// 2. 确定递归终止条件if (cur == null) {return;}travelTree(cur.left);// 3. 单层递归逻辑if (pre.val === cur.val) {count++;} else {count = 1;}pre = cur;if (count === maxCount) {res.push(cur.val);}if (count > maxCount) {res = [];maxCount = count;res.push(cur.val);}travelTree(cur.right);}travelTree(root);return res;};
感想
- 思路一样,但是在进行比较最大值的时候要灵活使用map,同时res是一个数组,不是一个数。
- 不使用map的没咋看懂。
Leetcode 236.二叉树的最近公共祖先
题目:236.二叉树的最近公共祖先 讲解:https://www.bilibili.com/video/BV1jd4y1B7E2
初始思路
代码
var lowestCommonAncestor = function (root, p, q) {// 后序遍历const travelTree = (root, p, q) => {if (root == null || root === p || root === q) {return root}// 处理逻辑let left = travelTree(root.left, p, q)let right = travelTree(root.right, p, q)if (left != null && right != null) {// 如果左右都有返回的话,说明这个点就是公共祖先return root}// 返回左右子树的值if (left == null && right != null) {return right} else if (left != null && right == null) {return left} else {return null}}return travelTree(root, p, q)};
感想
- 视频讲解很清晰,把思路看懂之后代码就可以看明白了。通过后序遍历实现回溯,如果在子树中匹配到了p或者q,就向祖先返回这个值,如果左右子树都返回了非空值,说明这个点就是公共祖先。
- 图示

- 原来已经打卡20天了吗,真快啊!什么时候能拿到offer呢。
