530. 二叉搜索树的最小绝对差
关键点:双指针 <=> 用全局变量保存上一个节点
var getMinimumDifference = function(root) {
let res = null;
let pre = null;
const traverse = (node) => {
if (!node) return;
traverse(node.left);
if (pre) {
const v = Math.abs(node.val - pre.val);
res = res ? Math.min(res, v) : v;
}
pre = node;
traverse(node.right);
}
traverse(root);
return res;
};
501. 二叉搜索树中的众数
关键点:出现新的最大频率时清空结果集
var findMode = function(root) {
let res = [];
let maxCnt = 0;
let cnt = 0;
let pre = null;
const traverse = (node) => {
if (!node) return;
traverse(node.left);
if (pre) {
if (pre.val === node.val) cnt += 1;
else cnt = 1;
} else {
cnt = 1;
}
pre = node;
if (cnt === maxCnt) {
res.push(node.val);
}
if (cnt > maxCnt) {
maxCnt = cnt;
res = [];
res.push(node.val);
}
traverse(node.right);
}
traverse(root);
return res;
};
236. 二叉树的最近公共祖先
var lowestCommonAncestor = function(root, p, q) {
if (root === p || root === q || !root) return root;
const l = lowestCommonAncestor(root.left, p, q);
const r = lowestCommonAncestor(root.right, p, q);
if (!l && !r) return null;
if (l && !r) return l;
if (!l && r) return r;
if (l && r) return root;
};