template <class DataType>
int BinaryTree<DataType>::maxWidth(BTNode<DataType>* node) {
if (node == nullptr) {
return 0;
}
int maxWidth = 0;
LinkQueue<BTNode<DataType>*> q ; // 创建一个队列用于层序遍历
q.EnQueue(node); // 将根节点入队
while (!q.IsEmpty()) {
int levelSize = q.GetLength(); // 当前层的节点个数
maxWidth = max(maxWidth, levelSize); // 更新最大宽度
for (int i = 0; i < levelSize; i++) {
BTNode<DataType>* currNode;
q.DelQueue(currNode); // 出队当前节点
if (currNode->lChild != nullptr) { // 如果当前节点有左孩子,则将其入队
q.EnQueue(currNode->lChild);
}
if (currNode->rChild != nullptr) { // 如果当前节点有右孩子,则将其入队
q.EnQueue(currNode->rChild);
}
}
}
return maxWidth;
}
template <class DataType>
int BinaryTree<DataType>::Width()
{
int width = maxWidth(root); // 调用maxWidth函数获取二叉树的最大宽度
return width;
}
上述代码实现了求二叉树的最大宽度(即二叉树中某一层的节点数量的最大值)。主要步骤如下:
- 首先判断给定的二叉树是否为空,若为空则直接返回0。
- 定义一个整型变量maxWidth用于存储最大宽度的值,并初始化为0。
- 创建一个队列q,用于层序遍历二叉树。将根节点入队。
- 进入循环,直到队列为空。每一次循环表示遍历二叉树的一层。
- 在每一层的开始时,获取当前队列中的节点个数levelSize(即该层的节点个数)。
- 更新maxWidth为max(maxWidth, levelSize),以确保记录最大宽度。
- 遍历当前层的所有节点,依次出队并判断其左右孩子是否存在,若存在则将其加入队列。
- 循环结束后,返回最大宽度。
注意:代码中使用了模板类和相应类模板BTNode,请确保这些相关定义在代码前已给出。
内容由零声教学AI助手提供,问题来源于学员提问