C++ 中二叉树的最大宽度
假设我们有一个二叉树,我们需要定义一个函数来获取给定树的最大宽度。这里树的宽度是指所有层中最大的宽度。我们将认为二叉树具有与完全二叉树相同的结构,但某些节点为空。某一层的宽度实际上是端节点之间的长度(该层中最左边和最右边的非空节点,其中端节点之间的空节点也计入长度计算)。因此,如果树如下所示:

那么最大宽度为 4,因为最后一层的节点为 [5,3,null,9]
为了解决这个问题,我们将遵循以下步骤:
ans := 1,size := 0
定义一个双端队列 q,我们将存储 (节点,值) 对。
将 (根节点,1) 插入 q
当 q 不为空时
size := q 的大小
定义一个 (节点,值) 对 curr
如果 size 为 1,则将 (队列首元素的节点,1) 插入 q,删除 q 中的元素
当 size 不为 0 时
curr := q 的首元素,删除 q 中的首元素
如果 curr 节点的左子节点不为空,则
创建 (当前节点的左子节点,curr 的值的 2 倍) 并插入 q
如果 curr 节点的右子节点不为空,则
创建 (当前节点的右子节点,curr 的值的 2 倍 + 1) 并插入 q
如果 q 的大小 > 1,则
ans := ans,q 中最后一个元素的值 – q 中第一个元素的值 + 1 的最大值
size := size – 1
返回 ans
让我们看看以下实现以更好地理解:
示例
#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int data){
val = data;
left = NULL;
right = NULL;
}
};
void insert(TreeNode **root, int val){
queue<TreeNode*> q;
q.push(*root);
while(q.size()){
TreeNode *temp = q.front();
q.pop();
if(!temp->left){
if(val != NULL)
temp->left = new TreeNode(val);
else
temp->left = new TreeNode(0);
return;
}else{
q.push(temp->left);
}
if(!temp->right){
if(val != NULL)
temp->right = new TreeNode(val);
else
temp->right = new TreeNode(0);
return;
}else{
q.push(temp->right);
}
}
}
TreeNode *make_tree(vector<int> v){
TreeNode *root = new TreeNode(v[0]);
for(int i = 1; i<v.size(); i++){
insert(&root, v[i]);
}
return root;
}
class Solution {
public:
int widthOfBinaryTree(TreeNode* root) {
int ans = 0;
deque < pair <TreeNode*, int> > q;
q.push_back({root,1});
ans = 1;
int size;
while(!q.empty()){
size = q.size();
pair <TreeNode*, int> curr;
if(size == 1){
q.push_back({q.front().first, 1});
q.pop_front();
}
while(size--){
curr = q.front();
q.pop_front();
if(curr.first->left){
q.push_back({curr.first->left, 2 * curr.second});
}
if(curr.first->right){
q.push_back({curr.first->right, 2 * curr.second + 1});
}
}
if(q.size() > 1)
ans = max(ans, q.back().second - q.front().second + 1);
}
return ans;
}
};
main(){
vector<int> v = {1,3,2,5,3,NULL,9};
TreeNode *root = make_tree(v);
Solution ob;
cout << (ob.widthOfBinaryTree(root));
}输入
[1,3,2,5,3,null,9]
输出
4
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP