自然语言描述:
struct node {
Elementtype data;
node *LChild;
node *RChild;
int level;
}
节点结构如上, level 用来标识节点所处的层数,
算法核心:层序遍历,需要用到队列
过程:
节点初始 level 都为 0
根节点入队
int maxLevel = 0;
while (队列不为空) {
node *tmp = 队列出队;
if (tmp->LChild) {
tmp->LChild 入队
tmp->LChild->level = tmp->level + 1;
}
if (tmp->RChild) {
tmp->RChild 入队
tmp->RChild->level = tmp->level + 1;
}
// 这一句保证最后 maxLevel 为最底层节点的层数
if (tmp->level > maxLevel) maxLevel = tmp->level;
}
上面的层序遍历时间复杂度为 O(n),做完之后每个节点都有自己所属的层数
vector<int> flag(maxLevel, 0);
再遍历一遍整棵树,每访问一个节点,
flag.at(node->level) += 1;
时间复杂度仍然是 O(n)
最后扫一遍 flag 数组,找出最大的值就是宽度。
return 0;