输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
var lowestCommonAncestor = function(root, p, q) {
// 使用递归的方法
// 需要从下到上,所以使用后序遍历
// 1. 确定递归的函数
const travelTree = function(root,p,q) {
// 2. 确定递归终止条件
if(root === null || root === p || root === q) {
return root;
}
// 3. 确定递归单层逻辑
let left = travelTree(root.left,p,q);
let right = travelTree(root.right,p,q);
// 于当前的根节点,我们分别递归地在左子树和右子树中查找p和q的最近公共祖先。
// 如果left和right都不为null,那么p和q分别位于当前根节点的两侧
// 所以最近公共祖先就是当前根节点,返回root。
if(left !== null && right !== null) {
return root;
}
// 如果left为null,那么p和q都位于右子树中
// 返回right作为最近公共祖先。
if(left === null) {
return right;
}
return left;
}
return travelTree(root,p,q);
};
501.二叉搜索树中的众数
var findMode = function(root) {
// 使用递归中序遍历
let map = new Map();
// 1. 确定递归函数以及函数参数
const traverTree = function(root) {
// 2. 确定递归终止条件
if(root === null) {
return ;
}
traverTree(root.left);
// 3. 单层递归逻辑
map.set(root.val,map.has(root.val)?map.get(root.val)+1:1);
traverTree(root.right);
}
traverTree(root);
//上面把数据都存储到map
//下面开始寻找map里面的
// 定义一个最大出现次数的初始值为root.val的出现次数
let maxCount = map.get(root.val);
// 定义一个存放结果的数组res
let res = [];
for(let [key,value] of map) {
// 如果当前值等于最大出现次数就直接在res增加该值
if(value === maxCount) {
res.push(key);
}
// 如果value的值大于原本的maxCount就清空res的所有值,因为找到了更大的
if(value>maxCount) {
res = [];
maxCount = value;
res.push(key);
}
}
return res;
};
530.二叉搜索树的最小绝对差
var getMinimumDifference = function (root) {
let arr = [];
// 中序遍历二叉搜索树。中序遍历的顺序是:左根右
const buildArr = (root) => {
if (root) {
buildArr(root.left);
arr.push(root.val);
buildArr(root.right);
}
}
// 对二叉搜索树进行中序遍历,将所有节点的值添加到数组 arr 中。
// 中序遍历二叉搜索树的结果是一个递增的有序数组。
buildArr(root);
let diff = arr[arr.length - 1];
// 用于存储任意两个节点之间的最小绝对差
// 初始值设为数组中最后一个元素的值。
for (let i = 1; i < arr.length; ++i) {
if (diff > arr[i] - arr[i - 1])
diff = arr[i] - arr[i - 1];
}
return diff;
};