软件设计师 · 数据结构 · 树与哈夫曼

软件设计师哈夫曼树 WPL 和二叉树遍历怎么做?

树这一块看起来像纯计算,其实考试更喜欢考“规则是否读准”。二叉树遍历看根节点位置,哈夫曼树看每一步是否选当前最小的两个权值。只要这两个动作稳住,很多题就不会乱。

软件设计师专题 软考题库编辑部 持续更新

二叉树遍历先盯住根节点

前序、中序、后序这三个名字,很多同学一开始会把注意力放在左子树上,结果越记越乱。更稳的办法是只看根节点:根在前面就是前序,根在中间就是中序,根在后面就是后序。

所以题干说“先访问根节点,再访问左子树和右子树”,不要犹豫,这就是前序遍历。题干说“左子树、根、右子树”,就是中序遍历。考试不会因为这个点复杂而变难,难的是你在紧张时把口诀看反。

遍历方式访问顺序记忆抓手
前序遍历根、左、右根节点在最前
中序遍历左、根、右根节点在中间
后序遍历左、右、根根节点在最后
层序遍历按层从上到下通常借助队列

哈夫曼树 WPL 不要直接加原始权值

哈夫曼树题最常见的错法,是把几个叶子权值随便分层,或者把最终根节点权值当成 WPL。标准做法很机械:每一步都从当前权值集合里选最小的两个合并,再把合并后的新权值放回集合。

如果只是求 WPL,一个很省事的做法是把每次合并产生的新权值加起来。比如 2、3、7、8:先合并 2 和 3 得 5,再合并 5 和 7 得 12,再合并 8 和 12 得 20,WPL 就是 5+12+20=37。

  1. 把所有权值从小到大排好。
  2. 选当前最小的两个权值合并。
  3. 把合并后的新权值放回集合,再重新比较。
  4. 每次合并产生的新权值累加,得到 WPL。

树题和栈、队列也常连在一起考

层序遍历常和队列联系在一起,因为它是一层一层访问;深度优先的递归遍历,则容易和栈的调用过程联系起来。软件设计师题目有时不会直接问“用什么结构”,而是把访问顺序写在场景里让你判断。

复习时不要把树、栈、队列割裂成三个孤立概念。你真正要掌握的是:先进后出适合回退和递归,先进先出适合排队和层次扩展。

相关题目解析

下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。