遇到二叉搜索树请记住,中序遍历是有序数组!!!左右根
二叉搜索树中的搜索
js
输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]
js
/**
* @param {TreeNode} root
* @param {number} val
* @return {TreeNode}
*/
var searchBST = function (root, val) {
if (!root) return null;
if (root.val === val) return root;
else if (val > root.val) return searchBST(root.right, val);
else return searchBST(root.left, val);
};
验证二叉搜索树
leetcode: 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
思路:二叉搜索树的中序遍历是从小到大的, 左右根
js
var isValidBST = function (root) {
// 二叉搜索树的中序遍历是从小到大的
function inorder(node) {
if (!node) return [];
return [...inorder(node.left), node.val, ...inorder(node.right)];
}
let arr = inorder(root);
for (let i = 1; i < arr.length; i++) {
if (arr[i] <= arr[i - 1]) return false;
}
return true;
};
优化 递归 提前减少遍历!
js
var isValidBST = function (root) {
// 二叉搜索树的中序遍历是从小到大的
let pre = -Infinity;
function check(node) {
if (!node) return true;
// check left
let left = check(node.left);
// check current
if (node.val < pre) return false;
pre = node.val;
// check right
let right = check(node.right);
return left && right;
}
return check(root);
};
二叉搜索树的最小绝对差
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
提示:树中至少有 2 个节点。
js
var getMinimumDifference = function (root) {
function inorderLoop(node) {
if (!node) return [];
return [...inorderLoop(node.left), node.val, ...inorderLoop(node.right)];
}
let inorder = inorderLoop(root);
let min = Infinity;
for (let i = 1; i < inorder.length; i++) {
min = Math.min(min, inorder[i] - inorder[i - 1]);
}
return min;
};
二叉搜索树中的众数
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
js
输入:root = [1,null,2,2]
输出:[2]
js
var findMode = function (root) {
let map = {};
function dfs(node) {
if (!node) return;
dfs(node.left);
dfs(node.right);
if (!map[node.val]) map[node.val] = 1;
else map[node.val]++;
}
dfs(root);
const max = Math.max(...Object.values(map));
return Object.keys(map).filter((key) => map[key] === max);
};
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内
todo...
把二叉搜索树转换为累加树
leetcode 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
BST 的中序遍历就是从小到大,那么反过来就是从大到小,然后累加就好了.
js
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var convertBST = function (root) {
let num = 0;
function dfs(node) {
if (!node) return null;
dfs(node.right);
node.val = node.val + num;
num = node.val;
dfs(node.left);
return node;
}
return dfs(root);
};