二叉树、二叉查找树。基本操作是遍历查找、插入和删除。
遍历
中序遍历序列有序!!!!如果不知道要怎么直接用树来解决,可以转成有序数组来做。
二叉查找树的查找操是常考的。
值得反复刷的题目:将有序数组转换为二叉搜索树、二叉搜索树迭代器
递归是处理二叉树问题常用的手段。尤其是在Depth维度上处理问题的时候。这周大部分题目也都是用递归来解决的。
递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。
三要素:
前序、中序、后序递归遍历的模板:这个太重要了,不然大部分二叉树的题都做不了。
144.二叉树的前序遍历
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def preorder(root, res):
if not root: return
res.append(root.val)
preorder(root.left, res)
preorder(root.right, res)
res = []
preorder(root, res)
return resclass Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def postorder(root, res):
if not root: return
postorder(root.left, res)
postorder(root.right, res)
res.append(root.val)
res = []
postorder(root, res)
return resclass Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
def inorder(root):
if not root:
return
inorder(root.left)
res.append(root.val)
inorder(root.right)
res = []
inorder(root)
return res递归值得反复刷的题:平衡二叉树、前中后序遍历、相同的树、翻转二叉树、最近公共祖先
额外补一下Tree BFS和DFS,其实就是树的两种遍历搜索方式。
可遍历一个树并使用一个队列来跟踪一个层级的所有节点,之后再跳转到下一个层级。任何涉及到以逐层级方式遍历树的问题都可以使用这种方法有效解决。
BFS 模式的工作方式是:将根节点推至队列,然后连续迭代直到队列为空。在每次迭代中,我们移除队列头部的节点并访问该节点。在移除了队列中的每个节点之后,我们还将其所有子节点插入到队列中。
如何识别 BFS 模式:
二叉树BFS值得反复刷的题目:序列化和反序列化
使用递归(或该迭代方法的技术栈)来在遍历期间保持对所有之前的(父)节点的跟踪。
DFS 模式的工作方式是从树的根部开始,如果这个节点不是一个叶节点,则需要做两件事:
如何识别 DFS 模式:
DFS 模式的问题:路径系列、二叉树中所有距离为 K 的结点
第一周其实就有接触堆:大根堆和小根堆。感觉堆的题目还是比较直观的。
面试还是要掌握手写数组构造大根堆和小根堆,贴个自己实现代码!
数据流的中位数这个题目可是太经典了,以后多刷。