700. 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。返回以该节点为根的子树。如果节点不存在,则返回 null 。
示例:输入:root = [4,2,7,1,3], val = 2,输出:[2,1,3]。
❝二叉搜索树具备的性质:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
❞
解题思路:「利用 BST 的特性,本题可以采用二分查找,如果当前节点值大于目标值,则递归查找左子树,否则递归查找右子树」。
时间复杂度:O(n),空间复杂度:O(n)。
const searchBST = (root, val) => {
if (!root) {
return null;
}
if (root.val === val) {
return root;
}
if (root.val > val) {
return searchBST(root.left, val);
} else {
return searchBST(root.right, val);
}
}
653. 两数之和 IV - 输入 BST
给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
示例:输入: root = [5,3,6,2,4,null,7], k = 9,输出: true。
解题思路:「和值问题,通过减法来降低问题的复杂性,那么在遍历的过程中,需要记录当前节点的值,从而来判断差值是否存在;又因为 BST 的特性,所以通过中序遍历可以得到一个递增序列,从而只需要遍历一次即可」。
时间复杂度:O(n),空间复杂度:O(n)。
const findTarget = (root, k) => {
let ans = false;
const record = new Set();
const help = (root) => {
if (!root) {
return;
}
help(root.left);
const reset = k - root.val;
if (record.has(reset)) {
ans = true;
return;
}
record.add(root.val);
help(root.right);
}
help(root);
return ans;
}
235. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
❝最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
❞
示例:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8,输出: 6。
解题思路:「利用 BST 的特性,如果当前节点大于 p 和 q,那么最近公共祖先必然在当前节点的左子树;如果当前节点小于 p 和 q,那么最近公共祖先必然在当前节点的右子树;如果以上两种条件多不满足,则当前节点即为 p 和 q 的最近公共祖先节点」。
时间复杂度:O(n),空间复杂度:O(n)。
const lowestCommonAncestor = (root, p, q) => {
if (!root) {
return null;
}
if (p.val < root.val && q.val < root.val) {
return lowestCommonAncestor(root.left, p, q);
} else if (p.val > root.val && q.val > root.val) {
return lowestCommonAncestor(root.right, p, q);
} else {
return root;
}
}
108. 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。
❝高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
❞
解题思路:「同样利用 BST 的特性,对升序数组进行二分处理,递归构建左右子树」。
时间复杂度:O(n),空间复杂度:O(n)。
const help = (nums, start, end) => {
if (start > end) {
return null;
}
const mid = Math.floor((start + end + 1) / 2);
const root = new TreeNode(nums[mid]);
root.left = help(nums, start, mid - 1);
root.right = help(nums, mid + 1, end);
return root;
}
const sortedArrayToBST = function (nums) {
return help(nums, 0, nums.length - 1);
}
写在最后
「感谢您能耐心地读到这里,如果本文对您有帮助,欢迎点赞、分享、或者关注下方的公众号哟。」