看的算法书是labuladong大佬的算法笔记,做笔记记录一下方便复习~
数组遍历框架,典型的线性迭代结构:
void traverse(int[] arr) {
for (int i = 0; i < arr.length; i++) {
// 迭代访问 arr[i]
}
}
链表遍历框架,兼具迭代和递归结构:
/* 基本的单链表节点 */
class ListNode {
int val;
ListNode next;
}
void traverse(ListNode head) {
for (ListNode p = head; p != null; p = p.next) {
// 迭代访问 p.val
}
}
void traverse(ListNode head) {
// 递归访问 head.val
traverse(head.next);
}
二叉树遍历框架,典型的非线性递归遍历结构:
/* 基本的二叉树节点 */
class TreeNode {
int val;
TreeNode left, right;
}
void traverse(TreeNode root) {
traverse(root.left);
traverse(root.right);
}
二叉树框架可以扩展为 N 叉树的遍历框架:
/* 基本的 N 叉树节点 */
class TreeNode {
int val;
TreeNode[] children;
}
void traverse(TreeNode root) {
for (TreeNode child : root.children)
traverse(child);
}
二叉树框架:
void traverse(TreeNode root) {
// 前序位置
traverse(root.left);
// 中序位置
traverse(root.right);
// 后序位置
}
题目:543. 二叉树的直径
解法:二叉树的后序遍历思想,套用二叉树框架,在后序位置
解法:后续位置更新最大路径和(int pathMaxSum = leftMax + rightMax + root.val)
题目:230.二叉搜索树中比k小的元素
解法:BST的中序遍历是升序的,用外部变量记录结果和当前元素排名。
题目:105.从前序与中序遍历序列构造二叉树
解法:先确定根节点,本质上是前序遍历,利用hashmap<k-v>确定值到索引的映射
HashMap<integer, Integer> valToIndex = new HashMap<>();
valToIndex.put(inorder[i], i);
// 递归构造左右子树
root.left= build(preorder, preStart +1, preStart + leftSize, inorder, inStart, index -1);
root.right= build(preorder, preStart + leftSize +1, preEnd, inorder, index +1, inEnd);