- stack&queue
- binary tree&binary search tree
stack FILO,先进后出,可以用array implement
queue FIFO,先进先出,可以用linked list implement
Stack:应用:树上的递归DFS改写为iteration
Queue:应用:1.BFS 2. Moving average
Moving average. LC 346. Moving Average from Data Stream. 可以用moving window的题目
- 二叉树
单纯的二叉树,一父节点最多两个子节点,没有大小要求。link list也算是一个二叉树。
Balanced binary tree:对任一节点来说左右子树的高度差不超过一。
二叉搜索树:左边所有节点<=中间<右边所有节点,平均O(logn),看看是不是balanced。
heap不能进行搜索的操作,只能保证插入删除元素时 logn。
- 二叉树
二叉树的遍历:可以用recursive
先序,中序,后序遍历。
叶节点的时候return;
preorder先序遍历:中左右
add; traverse left; traverse right
inorder中序遍历:左中右。
traverse left; add; traverse right;
postOrder后序遍历:左右中
traverse left; traverse right; add;
可以 go through一些树的list
- 遍历法(traversal)vs分治法
遍历法:依次遍历所有节点,遍历中做记录,对节点进行操作。每个结点的最大深度是上一次最大深度和当前深度的最大值,递归时当前深度+1。 可以用全局变量。 而且可能需要另加一个helper function来记录遍历中的cur_深度
分治法:先让左右子树去解决同样的问题,然后得到结果后在整合为整棵树的结果.一个结点的最大深度=左右儿子最大深度+1
例题:LC104. Maximum depth of binary tree.
例题:lc110: balanced binary tree。 细节,子树汇报的时候可以不只汇报height,还可以汇报boolean的balanced,或者用height-1来表示unbalance。因为,最下面子树不balance但是root仍有可能会判断为balance。
recursive经常写helper function,因为i可能return的value或者input可能不一样。
用stack表示inorder tranversal。without recursion。有个网站写了逻辑。
例题:LC173Binary search Tree iterator. 1h41min处
Lc98 validate BST。 1h42min。 可以用stack 来iterate tree,因为iprin出来的值一定是从小到大(BST)。
也可以用recursion来判断
BST上面的inorder tanversal一定是从小到大
LC938 range sum of BST. 可以用DFS和全局变量,recursive implement ation 。 2h00min
LC114. faltten binary tree to lined list. 2h4min. 遍历法可以,分治法,从下往上
作业:binary tree paths。