分析:
创建一个哈希表,储存每个节点和节点所在的层数。将头结点和他的层数1先记入哈希表中。接下来就是按照宽度优先遍历的顺序,按层逐个遍历。而且再将左右孩子推入队列的过程中,将节点所在层的信息记录到哈希表中。遍历的过程中记录节点的当前所在层,如果该节点与之前遍历的在同一层,则该层节点数增加,如果与之前遍历的不在同一层,说明进入下一层,需要将记录的节点数与之前的最大宽度取最大值,然后当前层数加一,当前层节点数置为1
完整代码
#include<iostream>
#include<queue>
#include<algorithm>
#include <unordered_map>
using namespace std;
//结构体定义
class Tree
{
public:
int val;
Tree* left;
Tree* right;
Tree(int x) {
this->val = x;
this->left = NULL;
this->right = NULL;
}
};
int getMaxWidth(Tree* head) {
if (head == nullptr) {
return 0;
}
queue<Tree*> q;
unordered_map<Tree*, int> levelmap;
levelmap.insert({ head,1 });
q.push(head);
int curlevel = 1;
int curNode = 0;
int m = INT_MIN;
while (!q.empty()) {
Tree* head = q.front();
q.pop();
int curnodelevel = levelmap.at(head);
if (curlevel == curnodelevel) {
curNode++;
}
else {
m = max(m, curNode);
curlevel++;
curNode = 1;
}
if (head->left != nullptr) {
levelmap.insert({ head->left,curlevel + 1 });
q.push(head->left);
}
if (head->right != nullptr) {
levelmap.insert({ head->right,curlevel + 1 });
q.push(head->right);
}
}
return max(m,curNode);
}
int main()
{
Tree* head = new Tree(5);
head->left = new Tree(3);
head->left->left = new Tree(2);
head->left->right = new Tree(4);
head->right = new Tree(8);
head->right->left = new Tree(6);
head->right->right = new Tree(10);
head->right->left->right = new Tree(7);
cout<<getMaxWidth(head);
system("pause");
return 0;
}