LeetCode hot 100 解题思路记录(二)
前情提要
本文是个人学习的粗糙笔记,仅记录思路和图解(跳过了困难题,等之后再弄)
视频看的是油管上的neetcode
二叉树
二叉树的中序遍历(简单)
中序遍历:访问顺序为左子树 → 根节点 → 右子树
思路一:迭代,遍历+栈
列表和栈初始化、将当前节点所有左子节点入栈、弹出栈顶节点记录值、转到右子树
思路二:Morris中序遍历(不想看,问问是否要多个思路来考核再来看)
二叉树的最大深度(简单)
思路一:深度优先搜索DFS
思路二:广度优先搜索BFS
翻转二叉树(简单)
思路:从下往上进行左右子树的翻转,用递归算法
对称二叉树(简单)
算法一:递归,双指针
p指针和q指针,最开始都指向树的根节点,随后p指针右移则q指针左移,p指针左移则q指针右移
算法二:迭代,队列
根节点初始化时加入队列两次
每次提取两个节点,比较值,再比较两节点的左右子节点的值(注意顺序)
当队列为空或检测到值不等时结束
二叉树的直径(简单)
对于任一节点,其直径等于左子树的最大深度 + 右子树的最大深度+2
二叉树的层序遍历
广度优先搜索BFS
结果列表、层列表、queue
有序数组转换为二叉搜索树(简单)
知识点:平衡二叉树,左节点>根节点>右节点
思路:中序遍历,选择中间位置左边/右边/任意一边为根节点
int mid = (left + right) / 2;
int mid = (left + right + 1) / 2;
int mid = (left + right + rand.nextInt(2)) / 2;
代码步骤:
-
取中点:选当前区间中间位置的值作为根节点
-
递归左右:
-
左子树 = 左边区间(
left
到mid-1
) -
右子树 = 右边区间(
mid+1
到right
)
-
-
终止条件:当
left > right
时返回null
验证二叉搜索树
5<4, 所以不能只比较相邻左右子节点
比较时有左右边界
算法有两种:递归、中序遍历
二叉搜索树中第K小的元素
思路:中序遍历
左子树小于当前节点数,右子树大于当前节点数
中序遍历顺序是左子树——根节点——右子树
二叉树的右视图
思路:广度优先搜索BFS
在二叉树层序遍历的基础上,对每层得到的数组取最右边的数值即可(图中的Res)