如何通过面试原题、图文详解、实例代码构建二叉搜索树、双指针、贪心面试题汇总?
摘要:本文将覆盖 「字符串处理」 + 「动态规划」 方面的面试算法题,文中我将给出: 1. 面试中的题目 2. 解题的思路 3. 特定问题的技巧和注意事项 4. 考察的知识点及其概念 5. 详细的代码和解析 开始之前,我们先看下
本文将覆盖 「字符串处理」 + 「动态规划」 方面的面试算法题,文中我将给出:
面试中的题目
解题的思路
特定问题的技巧和注意事项
考察的知识点及其概念
详细的代码和解析
开始之前,我们先看下会有哪些重点案例:
为了方便大家跟进学习,我在 GitHub 建立了一个仓库
仓库地址:超级干货!精心归纳视频、归类、总结,各位路过的老铁支持一下!给个 Star !
现在就让我们开始吧!
二叉搜索树
二叉搜索树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉搜索树。
验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 :
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
解题思路
乍一看,这是一道很简单的题。只需要遍历整棵树,检查 node.right.val > node.val 和
node.left.val < node.val 对每个结点是否成立。
问题是,这种方法并不总是正确。不仅右子结点要大于该节点,整个右子树的元素都应该大于该节点。例如:这意味着我们需要在遍历树的同时保留结点的上界与下界,在比较时不仅比较子结点的值,也要与上下界比较。
上述思路可以用递归法实现:
首先将结点的值与上界和下界(如果有)比较。然后,对左子树和右子树递归进行该过程。
视频
视频讲解和源码-验证二叉搜索树
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean isValidBST(TreeNode root, long min, long max){
if (root == null) {
return true;
}
if (root.val <= min || root.val >= max){
return false;
}
return isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max);
}
二叉搜索树中第K小的元素
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 :
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 3
解题思路
增加 getCount 方法来获取传入节点的子节点数(包括自己)
从 root 节点开始判断k值和子节点数的大小决定递归路径是往左还是往右。
