二叉树遍历先盯住根节点
前序、中序、后序这三个名字,很多同学一开始会把注意力放在左子树上,结果越记越乱。更稳的办法是只看根节点:根在前面就是前序,根在中间就是中序,根在后面就是后序。
所以题干说“先访问根节点,再访问左子树和右子树”,不要犹豫,这就是前序遍历。题干说“左子树、根、右子树”,就是中序遍历。考试不会因为这个点复杂而变难,难的是你在紧张时把口诀看反。
| 遍历方式 | 访问顺序 | 记忆抓手 |
|---|---|---|
| 前序遍历 | 根、左、右 | 根节点在最前 |
| 中序遍历 | 左、根、右 | 根节点在中间 |
| 后序遍历 | 左、右、根 | 根节点在最后 |
| 层序遍历 | 按层从上到下 | 通常借助队列 |
哈夫曼树 WPL 不要直接加原始权值
哈夫曼树题最常见的错法,是把几个叶子权值随便分层,或者把最终根节点权值当成 WPL。标准做法很机械:每一步都从当前权值集合里选最小的两个合并,再把合并后的新权值放回集合。
如果只是求 WPL,一个很省事的做法是把每次合并产生的新权值加起来。比如 2、3、7、8:先合并 2 和 3 得 5,再合并 5 和 7 得 12,再合并 8 和 12 得 20,WPL 就是 5+12+20=37。
- 把所有权值从小到大排好。
- 选当前最小的两个权值合并。
- 把合并后的新权值放回集合,再重新比较。
- 每次合并产生的新权值累加,得到 WPL。
树题和栈、队列也常连在一起考
层序遍历常和队列联系在一起,因为它是一层一层访问;深度优先的递归遍历,则容易和栈的调用过程联系起来。软件设计师题目有时不会直接问“用什么结构”,而是把访问顺序写在场景里让你判断。
复习时不要把树、栈、队列割裂成三个孤立概念。你真正要掌握的是:先进后出适合回退和递归,先进先出适合排队和层次扩展。
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- 哈夫曼树的带权路径长度 WPL 怎么计算?哈夫曼树 / WPL
- 二叉树前序、中序、后序遍历怎么区分?数据结构 / 二叉树
- 栈和队列的主要区别是什么?数据结构 / 栈
- 组合模式适合解决什么问题?设计模式 / 组合模式