LeetCode 704. 二分查找
📖 考察点
二叉搜索树相关 一般中序便历
📖 题意理解
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
💡 解题思路
比较前后的差 记录最小值
🔑 关键点总结
💻 代码实现
JavaScript
var getMinimumDifference = function (root) {
let stack = [];
let pre = null;
let cur = root;
let res = Number.MAX_SAFE_INTEGER;
while (stack.length || cur) {
if (cur) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
if (pre) {
res = Math.min(res, Math.abs(pre.val - cur.val));
}
pre = cur;
cur = cur.right;
}
}
return res;
};
⏱️ 复杂度分析
📚 总结与反思
LeetCode 501.二叉搜索树中的众数
📖 考察点
二叉搜索树,一般前序便历
📖 题意理解
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
💡 解题思路
前序便历,记录出现次数最多的数
🔑 关键点总结
前序便历
💻 代码实现
JavaScript
var findMode = function (root) {
let res = new Set();
let maxCount = 0;
let curCount = 0;
let cur = root;
let stack = [];
let pre = root.val;
while (stack.length || cur) {
if (cur) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
if (cur.val === pre.val) {
curCount++;
} else {
curCount = 1;
}
if (curCount > maxCount) {
maxCount = curCount;
res = new Set();
res.add(cur.val);
} else if (curCount === maxCount) {
res.add(cur.val);
}
pre = cur;
cur = cur.right;
}
}
return Array.from(res);
};
Rust
⏱️ 复杂度分析
📚 总结与反思
LeetCode 236. 二叉树的最近公共祖先
📖 考察点
后序便历 考虑好返回的情况
📖 题意理解
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
💡 解题思路
🔑 关键点总结
后序遍历
💻 代码实现
JavaScript
var lowestCommonAncestor = function (root, p, q) {
let res = null;
const findNode = (node, p, q) => {
if (!node) {
return 0;
}
let resLeft = 0;
let resRight = 0;
root.left && (resLeft = findNode(node.left, p, q));
root.right && (resRight = findNode(node.right, p, q));
if (res) {
return -1;
}
let power = resLeft | resRight;
if (node === p) {
power |= 10;
}
if (node === q) {
power |= 100;
}
if ((power & 110) === 110) {
res = node;
}
return power;
};
findNode(root, p, q);
return res;
};