参考https://labuladong.gitee.io/ 进行模板的整理
数据结构
二叉树
二叉搜索树
对于 BST 的每一个节点
node
,左子树节点的值都比node
的值要小,右子树节点的值都比node
的值大。对于 BST 的每一个节点
node
,它的左侧子树和右侧子树都是 BST。BST 的中序遍历结果是有序的(升序)。
1
2
3
4
5
6
7void traverse(TreeNode root) {
if (root == null) return;
traverse(root.left);
// 中序遍历代码位置
print(root.val);
traverse(root.right);
}进行BST验证的时候不能仅仅只考虑左右以及根节点,因为root的整个左子树都要小于root.val,右子树同理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15boolean isValidBST(TreeNode root) {
return isValidBST(root, null, null);
}
/* 限定以 root 为根的子树节点必须满足 max.val > root.val > min.val */
boolean isValidBST(TreeNode root, TreeNode min, TreeNode max) {
// base case
if (root == null) return true;
// 若 root.val 不符合 max 和 min 的限制,说明不是合法 BST
if (min != null && root.val <= min.val) return false;
if (max != null && root.val >= max.val) return false;
// 限定左子树的最大值是 root.val,右子树的最小值是 root.val
return isValidBST(root.left, min, root)
&& isValidBST(root.right, root, max);
}BST搜索元素记得左小右大就行了,插入元素同理(找到root==nullptr的时候插入一个新的节点)。
遍历
DFS 遍历框架
1 | void traverse(TreeNode root) |
层序遍历框架:
1 | // 输入一棵二叉树的根节点,层序遍历这棵二叉树 |
BFS框架:
1 | // 计算从起点 start 到终点 target 的最近距离 |
算法
排序
归并排序
归并排序的逻辑,若要对 nums[lo..hi]
进行排序,我们先对 nums[lo..mid]
排序,再对 nums[mid+1..hi]
排序,最后把这两个有序的子数组合并,整个数组就排好序了。
1 | void sort(int[] nums, int lo, int hi) { |
快速排序
快速排序的逻辑是,若要对 nums[lo..hi]
进行排序,我们先找一个分界点 p
,通过交换元素使得 nums[lo..p-1]
都小于等于 nums[p]
,且 nums[p+1..hi]
都大于 nums[p]
,然后递归地去 nums[lo..p-1]
和 nums[p+1..hi]
中寻找新的分界点,最后整个数组就被排序了。
1 | //严蔚敏《数据结构》标准分割函数 |