BM39 序列化二叉树:
最先想到的就是用层序遍历,用’!‘标示数值的结束,用’#‘标示空节点。
1、序列化的过程很简单,用队列完成层序遍历,有数值就在字符串后加上’#‘,否则加上"val" + "!"即可
2、反序列化是层序遍历的逆过程,先对序列化的字符串做一下预处理,根据’!'对每个结点进行分割,用vector来存储每个结点所对应的字符串,然后进性层序遍历
总结:这道题的思路不难,难的是如何写代码,字符串的处理要比较熟悉

BM40 重建二叉树:
由前序中序遍历结果返回原树。
思路是采用递归,和之前手算的思路一样,从左往右遍历前序序列,获得前序遍历的根子树,然后在中序序列中找到根子树的位置,获得中序对应的左子树和右子树。
因为中序是(左子树、根、右子树)
前序是(根、左子树、右子树)
因此中序左子树的个数和前序对应的位置是一样的,找到前序的左子树和右子树,然后递归。

BM41 输出二叉树的右视图:
首先根据前序和中序恢复二叉树,然后打印右视图。
建树部分和上题一样,打印右试图依旧采用层序遍历,用队列做,然后用count变量记录每一层大小。

BM42 用两个栈实现队列:
一个栈入一个栈出,比较简单。

BM43 包含min函数的栈
采用两个栈,一个是数据栈进性正常的入栈和出栈操作,另一个是最小值栈

BM45 滑动窗口的最大值
采用单调队列的一道经典习题。
遍历数组的每一个元素,如果容器为空,则直接将当前元素加入到容器中。如果容器不为空,则让当前元素和容器的最后一个元素比较,如果大于,则将容器的最后一个元素删除,然后继续讲当前元素和容器的最后一个元素比较如果当前元素小于容器的最后一个元素,则直接将当前元素加入到容器的末尾如果容器头部的元素已经不属于当前窗口的边界,则应该将头部元素删除
总结一下,首先容器中放的元素应该是单调递减的。然后还有删除容器头部元素和最后一个元素的操作。因此,这样的数据结构就是双端队列。c++中就是deque。
如何判断队列中头部的元素是否过期呢?
这里我们可以存数组的下标,根据下标的比较来判断。比如,当前遍历到下标为5的元素,窗口的大小为3, 显然显然下标为2的已经过期了。