이진 트리가 있다고 가정하고 주어진 트리의 최대 너비를 가져오는 함수를 정의해야 합니다. 여기서 트리의 너비는 모든 레벨 중 최대 너비입니다. 이진 트리는 전체 이진 트리와 동일한 구조를 갖지만 일부 노드는 null인 것으로 간주합니다. 한 수준의 너비는 실제로 끝 노드 사이의 길이입니다(수준에서 가장 왼쪽 및 가장 오른쪽의 null이 아닌 노드, 끝 노드 사이의 null 노드도 길이 계산에 포함됨). 트리가 다음과 같다면 -

마지막 레이어의 노드가 [5,3,null,9]
이므로 최대 너비는 4입니다.이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
답변 :=1, 크기 :=0
-
(노드, 값) 쌍을 저장할 이중 종료 대기열 q를 정의합니다.
-
q에 (루트, 1) 삽입
-
q가 비어 있지 않은 동안
-
size :=q의 크기
-
(노드, 값) 쌍 curr 정의
-
크기가 1이면 (앞 요소의 노드, 1) q로, q에서 요소 삭제
-
크기가 0이 아닌 동안
-
curr :=q의 앞 요소, q에서 앞 요소 삭제
-
curr 노드의 왼쪽이 null이 아니면
-
생성(현재 노드의 왼쪽, 2*curr의 값) 및 q
에 삽입
-
-
curr 노드의 오른쪽이 null이 아니면
-
생성(현재 노드의 오른쪽, 2*curr의 값 + 1) 및 q
에 삽입
-
-
크기가 q> 1이면
-
ans :=ans의 최대값, q의 마지막 요소 값 – q의 첫 번째 요소 값 + 1
-
-
크기 :=크기 – 1
-
-
-
반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
#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