标签:问题: 问题 适合 个人 顺序 rand 创建 利用 反序
这部分其实说的很好,算法是能力,但是面试是“技巧+能力”。面试不能够充分反应一个人的算法水平,但是配合一些技巧可以帮助展现出自己的水平。结合书中内容和自己的做题,总结了以下内容:
二叉树镜像操作。首先要理解镜像的概念,为了形象化,可以画图,指的是左右交换,并且左子树右子树也对应交换,显然是一种递归的操作。
判断对称二叉树。首先要理解对称的概念。此时问题转化为比较镜像二叉树和原二叉树是否相等——判断两个二叉树是否相同——利用递归定义判断即可。需要注意一个特殊情况是两个树都没有某个节点时的情况。
打印路径,没有别的技巧,只是循环边界条件的处理。可以手动画一个小的图,写出转折点,找规律。
求栈中元素的最小值。类似单调栈,使用一个普通栈+一个单调栈储存降序数据。
构造一个栈,直接模拟即可。
二叉树层序遍历。使用队列实现。
BST的判断问题,使用递归实现,主要是考虑递归函数中什么时候需要返回false(该子树不满足BST性质的时候),还可以用单调栈实现,有待进一步学习。
还是二叉树上的操作。首先要读懂题意,这个路径指的是从根到叶的路径,而不是任意一条路径。因此判定的时候要保证节点无左右子树,且路径之和满足要求。使用DFS可以解决。
从35到38题都是关于复杂问题的分析。从横向看,问题可以分解为多个不同的小问题依次解决,从纵向看,问题可以使用分治的思想,变成多个问题规模较小的同样问题。这些问题难度通常较大。
看了相关题解,35题可以使用原地修改的方法进行复制,不需要额外的空间。方法是创建一系列相同的链表节点,每个节点串在原始节点后面,之后更新random指针,最后再分离两个链表。书中的做法是hash,但是hash要储存新节点与原节点的配对关系,需要额外空间。
DFS的过程中处理新链表,需要熟悉树遍历的顺序,同时使用全局变量处理一下最左节点。
序列化二叉树问题:首先要明确一下序列化的概念,序列化只需要能够变成一维字符串并且复原回来就可以,并非等价于完全二叉树层序遍历的顺序,此处需要研究一下给出的例子。之后就用层序遍历进行模拟即可,需要注意的是反序列化的时候需要处理‘,‘分割的结果,这个在C++里面有点繁琐。
当然还有一些细节的地方就是字符串转int和int转字符串。
字符串的全排列,很自然想到树搜索中的排列树,因此需要DFS,同时记录访问过的节点。无额外剪枝手段。
标签:问题: 问题 适合 个人 顺序 rand 创建 利用 反序
原文地址:https://www.cnblogs.com/hesun/p/13381786.html