题解36 | BFS#二叉树的最大宽度#
二叉树的最大宽度
https://www.nowcoder.com/practice/0975d62a307549cea32f353f354a7377
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ #include <algorithm> #include <queue> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return int整型 */ int widthOfBinaryTree(TreeNode* root) { // write code here if(root == NULL) return 0; int res = 0,first,pose; queue<int> q; q.push(1); queue<TreeNode*> t; t.push(root); TreeNode *now; while (!q.empty()) { int len = q.size(); for(int i = 0 ; i < len; i++){ now = t.front(); t.pop(); pose = q.front(); q.pop(); if(i == 0) first = pose; if(i == len-1) res = std::max(res, pose - first + 1); if(now->left){ t.push(now->left); q.push(pose*2); } if(now->right){ t.push(now->right); q.push(pose*2+1); } } } return res; } };
算法基本思想
使用队列进行层次遍历二叉树,同时使用另一个队列记录每个节点的位置信息。
对于每一层的节点,计算出最左边节点和最右边节点的位置,然后计算宽度并更新最大宽度。
最后返回最大宽度。
具体步骤
该算法的详细步骤如下:
- 初始化变量res为0,用于记录最大宽度。
- 创建一个队列q和一个队列t,分别用于存储节点的位置信息和节点本身。
- 将根节点的位置1入队q,将根节点入队t。
- 进入循环,直到队列q为空。
- 在每一轮循环中,先获取队列q的大小len,表示当前层的节点个数。
- 遍历当前层的节点,从0到len-1。从队列t中取出一个节点now,从队列q中取出一个位置pose。
- 如果当前节点是当前层的第一个节点(i == 0),则将pose赋值给first。
- 如果当前节点是当前层的最后一个节点(i == len-1),则计算宽度(pose - first + 1)并更新res。
- 如果当前节点有左子节点,则将左子节点入队t,位置pose*2入队q。
- 如果当前节点有右子节点,则将右子节点入队t,位置pose*2+1入队q。
- 返回res作为结果。
时间复杂度:
O(n),其中n是二叉树的节点个数。需要遍历所有节点。
空间复杂度:
O(n),其中n是二叉树的节点个数。需要使用队列和另一个队列分别存储节点和位置信息。
2024考研数据结构 文章被收录于专栏
本人考研刷算法题,立此专栏练习强化。